第六章:关键词大观园 —— 那些带 @ 的家伙

在 C 语言里,关键词通常没有前缀。 在 OC 里,为了避免和 C 语言的关键词冲突(因为 OC 是 C 的超集),OC 的特有关键词前面都带了一个 @。 这让 OC 的代码看起来充满了“邮件感”。

6.1 @interface 与 @implementation

如果你想定义一个类 Person,你需要两步:

1. 在头文件(.h)里昭告天下 (@interface):

@interface Person : NSObject
// 我有什么属性
@property (nonatomic, strong) NSString *name;
// 我能干什么
- (void)sayHello;
@end

这就好比你的名片。

2. 在实现文件(.m)里修炼内功 (@implementation):

@implementation Person
- (void)sayHello {
    NSLog(@"Hello, I am %@", self.name);
}
@end

这就好比你的真身。

6.2 +/- 号的分野

你在方法定义前会看到 -+

  • - (减号):实例方法 (Instance Method)。必须先 alloc init 出一个对象才能用。 [person sayHello]
  • + (加号):类方法 (Class Method)。直接对着类喊。 [Person new]

6.3 @property 的魔力

在很久很久以前,我们必须手动写 getter 和 setter。 @property 的出现拯救了我们。 @property (nonatomic, strong) NSString *name; 这一行代码,编译器自动帮你生成了 _name 成员变量,name (getter) 方法,和 setName: (setter) 方法。

这里的 nonatomicstrong (或者 copy, assign, weak) 是内存管理的“咒语”。

  • strong: “你是我的,我死你才能死。” (拥有权)
  • weak: “我看着你,你死了我就当不认识你。” (弱引用,防止循环引用)
  • copy: “复印一份给我,原件随你便。” (通常用于字符串)
  • assign: “我就存个地址,死了别找我。” (用于基本数据类型)

6.4 别的 @ 伙伴

  • @class: “这就是个类名,别问细节,先编译过去再说。” (前向声明)
  • @protocol: “这也是一份合同,签了就得干活。” (协议/接口)
  • @synthesize: “编译器,帮我生成代码。” (现在基本不用写了)
  • @dynamic: “编译器,别管,我自己会在运行时搞定。” (高阶玩法)
使用 Hugo 构建
主题 StackJimmy 设计