@property(屬性): 聲明setter
和getter
方法
@synthesize(合成): 根據@property
聲明的屬性生成實例變量,并自動實現setter
和getter
方法
@dynamic:告訴編譯器不生成實例變量、getter
和setter
方法
1.最常用的方法,只使用@property
//.h
@interface ViewController : UITableViewController
@property (nonatomic, copy) NSString *name; //聲明一個屬性
@end
//.m
@implementation ViewController
//不需要顯示聲明@synthesize, xcode會自動調用@synthesize,根據聲明的name屬性,自動生成_name變量
- (void)viewDidLoad {
[super viewDidLoad];
self.name = @""; //setter方法已自動實現
_name = @"艾瑪"; //_name已自動生成
NSLog(@"_name:%@", self.name);
//打印結果_name:艾瑪,說明_name 即屬性name的實例變量
}
@end
2.顯示聲明@synthesize
//.h
@interface ViewController : UITableViewController
@property (nonatomic, copy) NSString *name; //聲明一個屬性
@end
//.m
@implementation ViewController
@synthesize name; //對name屬性生成實例變量name, 并生成setter和getter方法
- (void)viewDidLoad {
[super viewDidLoad];
self.name = @""; //setter方法已自動實現
name = @"艾瑪"; //_name已自動生成
NSLog(@"self.name:%@", self.name);
//打印結果self.name:艾瑪,說明name 即屬性name的實例變量
}
@end
3.顯示聲明@synthesize
和不顯示聲明@synthesize
對生成變量名的區別
通過上面1和2的對比,會發現不聲明@synthesize時,系統自動生成的變量名比屬性名多了個_(下劃線)
4.顯示關聯實例變量和屬性名稱
//.h
@interface ViewController : UITableViewController
@property (nonatomic, copy) NSString *name;
@end
//.m
@implementation ViewController
@synthesize name = _name; //關聯實例變量_name到屬性name上,即屬性name生成的實例變量名為_name
- (void)viewDidLoad {
[super viewDidLoad];
self.name = @"";
_name = @"艾瑪";
NSLog(@"self.name:%@", self.name);
//打印結果self.name:艾瑪,說明_name 即屬性name的實例變量
}
@end
5.@dynamic
的使用
//.h
@interface ViewController : UITableViewController
@property (nonatomic, copy) NSString *name;
@end
//.m
@implementation ViewController
@dynamic name; //通知編譯器不要自動生成實例變量,setter和getter
- (void)viewDidLoad {
[super viewDidLoad];
self.name = @""; //此處沒有錯誤提示, 因為@property聲明了setter和getter方法,只是沒有實現
_name = @"艾瑪"; //這里會有錯誤提示,如下圖所示
NSLog(@"self.name:%@", self.name);
}
@end
WX20170509-163855.png
6.最后加一個小嘗試,@dynamic
和@synthesize
同時使用會怎么樣?直接上圖吧
@dynamic在上.png
@synthesize在上.png
ps:在著名的《招聘一個靠譜的 iOS》的參考答案中指出,@property = ivar + getter + setter;
個人感覺稍微欠妥,也可能是我理解錯誤,還請大家指正!