IOS 在MRC和ARC @property 与 @synthesize 特性
一、格式与例子
- 格式
1 (参数1, 参数2, 参数3) 类型 变量名;
- 例子
1 @property (nonatomic, assign, readonly) NSString *iText;
二、MRC下,特性
- @property 声明的属性,在编译时刻会生成相应的成员变量(_XXX),除非,声明一个与属性同名的成员变量,则不会自动生成相应的_XXX成员变量。
- @property 与 @synthesize 是成对出现的。
- @property 特性是由xcode自动生成setter和getter方法的声明 。
- @synthesize 特性是由xcode自动生成setter和getter方法的定义。
- @property 是在@interfance与@end之间,并且,不能声明类成员作用域中。
- @synthesize 是在@implemention与@end之间。
- 使用@property定义的变量,可以在其它类中依然有效。
- 在@property定义的变量,使用格式:self.*,而这种格式在@interface块作用域中定义的成员变量,不能如此使用。
三、在MRC下,@property 与@synthesize原理
1 @interface Demo : NSObject 2 { 3 NSString *name; 4 } 5 6 @property (nonatomic, copy) NSString *name; 7 @end 8 9 @implementation Demo 10 @synthesize name; 11 12 - (void)print 13 { 14 NSLog(@"name : %@", self.name); 15 } 16 @end
@property 是由编译器在编译时刻为其生成getter and setter方法声明。(上面第七行代码)
@synthesize 是由编译器在编译时刻为其生成getter and setter方法定义。其下为setter实现:
1 @implementation 2 - (void)setName:(NSString *)aName 3 { 4 [aName retain]; 5 [iName release]; 6 iName = aName; 7 } 8 9 - (instancetype)getName 10 { 11 return [iName autorelease]; 12 } 13 @end
四、在ARC下,@property则做了三件事:
1. 由@property声明的属性,在编译时刻为其生成成员变量(_XXX),除非,声明一个与属性同名的成员变量,则不会自动生成相应的_XXX成员变量。
1 @interface CWATempScheduleViewController 2 { 3 // Boolean _state; // 隐式生成 4 } 5 6 @property (nonatomic, assign) Boolean state; 7 8 @end
2. 由@property声明的属性,在编译时刻为其生成getter和setter方法的声明与定义。