@property, @sythesize,@dynamic

@property(屬性): 聲明settergetter方法
@synthesize(合成): 根據@property聲明的屬性生成實例變量,并自動實現settergetter方法
@dynamic:告訴編譯器不生成實例變量、gettersetter方法

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;個人感覺稍微欠妥,也可能是我理解錯誤,還請大家指正!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容