前言:
用@property定義的屬性底層會擴展成_開頭的成員變量,setter,getter方法。
例如:
/********Person.h文件********/
// 聲明age屬性
@property(nonatomic,assign)int age;
/********Person.m文件********/
// 同時重寫屬性的setter方法和getter方法,系統就不會幫我們生成下劃線的成員變量_age,所以會報_age找不到的錯誤
// 解決辦法:手動生成_age成員變量,即 @synthesize age = _age;
@synthesize age = _age;
-(void)setAge:(int)age{// 重寫setter方法
_age=age;
}
-(int)age{// 重寫getter方法
return _age;
}
開發中訪問屬性的做法
self.xxx = yyy; //有等號就是調用setter方法
self.xxx;//沒有等號,或者self.xxx在等號右邊就是調用getter方法。另外懶加載實質是調用getter方法
開發中,self.xxx和_xxx區別
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,assign)int age;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// self.xxx的形式.
self.age = 100;// 底層調用setter方法 -(void)setAge:(int)age{ _age=age;},給_age賦值
NSLog(@"%d",self.age);// 底層調用getter方法 -(int)age{return _age;} 獲取到_age,
// _xxx的形式
_age = 200;// 底層直接對setter方法中的_age賦值,不會調用setter方法
NSLog(@"%d",self.age);// 調用getter方法,看是否已經對_age完成了賦值
}
@end
Snip20160913_1.png
- 用@property關鍵字來聲明的屬性,在編譯期會默認生成一個下劃線加名稱的屬性變量,并且自動在implemention文件中生成setter和getter方法。
- 使用_xxx的方式是操作變量,而通過點語法調用self.xxx這種形式,實際是調用setter方法或者getter方法