Objective-C中的保留字

@property

作用:声明属性,如

  1. @interface ViewController()
  2. @property (nonatomic, copy) NSString *name;
  3. @end

说明:编译器会自动为该属性生成 gettersetter 方法,以及一个对应的变量名,变量名的格式是_ + 属性名(如_name)。在代码中便可以如下的使用:

  1. self.name = @"haha"; // setter
  2. NSLog(@"name: %@", self.name); // getter
  3. NSLog(@"name: %@", _name);

注意:

  • self.name访问的是属性,会调用 gettersetter 方法;_name访问的是变量,不会触发 gettersetter 方法。
  • 自动生成的变量只能在类的内部访问,而属性则可以在类的外部访问。




@synthesize

作用:生成 gettersetter 方法(如果使用@property声明属性,则不用写@synthesize 属性名;,因为编译器会自动加上),如

  1. @interface ViewController()
  2. @property (nonatomic, copy) NSString *name;
  3. @end
  4. @implementation ViewController
  5. @synthesize name; // 这一句可以不写,编译器会自动加上(默认加上 @synthesize name = _name;)
  6. @end

注意:如果要重写某个属性的 gettersetter 方法,则必须显示地的写明:@synthesize name = _name;,否则会报错,提示_name为定义,如

  1. @interface ViewController()
  2. @property (nonatomic, copy) NSString *name;
  3. @end
  4. @implementation ViewController
  5. @synthesize name = _name; // 这句必须有,否则会报错
  6. - (NSString *)name {
  7. return _name;
  8. }
  9. - (void)setName:(NSString *)name {
  10. _name = name;
  11. }
  12. @end




@dynamic

作用:用于生成对应的 settergetter 方法,但@ dynamic表示这个成员变量的 settergetter 方法并不是直接由编译器生成,而是手工生成或者运行时生成,如

  1. @interface ViewController()
  2. @property (nonatomic, copy) NSString *name;
  3. @end
  4. @implementation ViewController
  5. @dynamic name;
  6. - (NSString *)name {
  7. return _name;
  8. }
  9. - (void)setName:(NSString *)name {
  10. _name = name;
  11. }
  12. @end

注意:如果为某个属性应用了该关键字,却没有实现 settergetter 方法,那么在编译时还不会报错,但在运行的时候可能会Crash(如果访问了该属性的 settergetter 方法)。




@encode

作用:用于表示一个类型的字符串(官方的类型说明文档),如

  1. char *enc1 = @encode(int); // enc1 = "i"
  2. char *enc2 = @encode(id); // enc2 = "@"




@compatibility_alis

作用:用于给一个类设置一个别名,如

  1. #import "ViewController1.h"
  2. #import "ViewController2.h"
  3. @compatibility_alias Test ViewController2;
  4. @implementation ViewController1
  5. - (void)viewDidLoad {
  6. [super viewDidLoad];
  7. Test *controller = [Test new];
  8. [self.navigationController pushViewController:controller animated:YES];
  9. }
  10. @end




@autoreleasepool

作用:用于 ARC 下代替 NSAutoreleasePool苹果的官方文档 中提到,@autoreleasepoolNSAutoreleasePool 快 6 倍。




参考资料