01).@property
01>.自動生成getter 和 setter 方法的聲明
自動給當前類生成一個私有屬性(在@implementation中),這個屬性名稱自帶下劃線
自動生成getter 和 setter 方法的實現
02>.語法格式
@property 數據類型 去掉下劃線的屬性名稱;
批量生成
@property 數據類型 名稱,名稱,….;
注:類型必須相同
@property NSString *name,color;
03>.@property 生成的實現,沒有邏輯驗證
//重寫
- (void)setName:(NSString *)name
{
if(name.length < 2)
{
_name = @"無名";
}
else
{
_name = name;
}
}
重寫後依然會自動生成getter方法的實現
注:如果getter 和 setter 方法的實現全部重寫,就不會自動生成私有屬性了,需要自己寫
04>.@property可以帶參數
語法格式:
property(參數1,參數2,參數3......)數據類型 名稱;
可變性 (Mutability)
readonly,只生成getter方法,沒有setter方法
readwrite,是默認的
內存管理 (Memory management)
assign,是默認的,適用於內置類型(int, bool等)或者代理對象(delegate),不存在引用計數機制。
retain,只適用於對象,不適用內置類型(int, bool等)。當使用setter方法時,將對象的引用計數加1。
copy,使用setter方法時,拷貝一個對象,即在內存中產生新對象,而不是把原來的對象的引用計數加1。顯然,複製出來的新對象的引用計數爲1。
併發性 (Concurrency)
nonatomic,訪問屬性非原子性,一般單線程聲明nonatomic,考慮到速度問題。多線程程序就不要使用nonatomic。
atomic,訪問屬性原子性,與nonatomic相反。
API控制 (API control)
getter=newGetterName,指定新的getter方法名,一般重新改寫BOOL實例變量的getter名。
@property(getter = isFinished)BOOL finished;
02).@synthesize
1>.自動生成getter 和 setter 方法的實現
2>.語法
@synthesize @pro名稱;
寫在@implementation裏,是真私有屬性
@synthesize name; //生成的私有屬性是不帶下劃線的
03>.自動生成私有屬性
解決方法 @synthesize @pro名稱 = 已經存在的屬性名;
@synthesize name = _name;
04>.注意
類型不同也能批量生成
@interface HMPerson : NSObject
@property NSString *_name;
@property int _age;
@end
@implementation HMPerson
@synthesize name = _name,age = _age;
@end
03).setter和getter方法的調用
//顯示調用(發送消息)
[somePerson setName:@"小明"]; //setter
[somePerson name]; //getter
//隱式調用(點語法)
somePerson.name = @"Jack"; //setter
NSString *perName = somePerson.name; //getter
//在實例方法中直接使用實例變量
-(void)someMethod
{
NSString *myString = _name;
_name = @"A string";
}
顯然直接使用實例變量會有風險,如內存泄露、循環引用等。最好訪問實例變量,都通過@property產生的setter和getter方法。