手把手教你定义 Objective-C 类

1. 创建类接口文件 (.h)

定义类的公开属性和方法声明,使用@interface关键字:

// Person.h
#import <Foundation/Foundation.h>

@interface Person : NSObject

// 属性声明规范
@property (nonatomic, copy) NSString *name;  // 字符串用copy
@property (nonatomic, assign) NSInteger age; // 基础类型用assign
@property (nonatomic, strong) NSArray *skills; // 对象类型用strong

// 方法声明规范
- (void)introduceSelf;  // 实例方法
+ (void)speciesInfo;    // 类方法

// 初始化器规范
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;

@end

2. 创建类实现文件 (.m)

实现具体逻辑,使用@implementation关键字:

// Person.m
#import "Person.h"

@implementation Person

// MARK: - 初始化器实现
- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
    self = [super init];  // 必须调用父类初始化
    if (self) {
        _name = [name copy];  // 直接访问实例变量
        _age = age;
        _skills = @[@"Objective-C", @"Swift"];
    }
    return self;
}

// 默认初始化器重写
- (instancetype)init {
    return [self initWithName:@"Unknown" age:0]; // 复用指定初始化器
}

// MARK: - 方法实现
- (void)introduceSelf {
    NSLog(@"我叫%@, 今年%ld岁", self.name, (long)self.age);
}

+ (void)speciesInfo {
    NSLog(@"人类");
}

// MARK: - 内存管理
- (void)dealloc {
    // 清理资源(ARC环境下通常无需实现)
}

@end

3. 关键规范说明
  1. 属性特性选择

    • copy:字符串/可变对象(防止外部修改)
    • strong:对象类型(默认所有权)
    • assign:基础类型(int/float等)
    • weak:避免循环引用(如delegate)
  2. 初始化器规范

    • 主初始化器需完整参数:initWithName:age:
    • 次要初始化器调用主初始化器(如init
    • 必须检查if (self)后才赋值
  3. 方法命名规范

    • 实例方法:- (返回值类型)方法名
    • 类方法:+ (返回值类型)方法名
    • 参数格式:(类型)参数名
  4. 实例变量访问

    • 初始化器内使用_name直接访问
    • 其他方法使用self.name(触发属性特性)
4. 使用示例
// 创建实例
Person *developer = [[Person alloc] initWithName:@"张三" age:28];

// 访问属性
developer.skills = @[@"iOS开发", @"性能优化"];

// 调用方法
[developer introduceSelf];  // 输出:我叫张三, 今年28岁
[Person speciesInfo];       // 输出:人类

最佳实践

  1. 所有属性明确定义非原子性(nonatomic
  2. 避免在初始化器内调用方法(对象未完全初始化)
  3. 自定义类前缀(如XYZPerson)避免命名冲突
  4. 使用instancetype代替id确保类型安全
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐