在 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) 方法。
这里的 nonatomic 和 strong (或者 copy, assign, weak) 是内存管理的“咒语”。
strong: “你是我的,我死你才能死。” (拥有权)weak: “我看着你,你死了我就当不认识你。” (弱引用,防止循环引用)copy: “复印一份给我,原件随你便。” (通常用于字符串)assign: “我就存个地址,死了别找我。” (用于基本数据类型)
6.4 别的 @ 伙伴
@class: “这就是个类名,别问细节,先编译过去再说。” (前向声明)@protocol: “这也是一份合同,签了就得干活。” (协议/接口)@synthesize: “编译器,帮我生成代码。” (现在基本不用写了)@dynamic: “编译器,别管,我自己会在运行时搞定。” (高阶玩法)