標籤:
Objective-C中的@property和@synthesize用法
1.關鍵詞@property和@synthesize在Obj-c中是配對使用的,用於對聲明和實現的編碼簡化;
eg:
標頭檔(.h)中聲明
@property int personAge;
等價於:
-(int)personAge;
-(void)setPersonAge:(int)age;
檔案(.m)實現
@synthesize personAge;
等價於:
-(int)personAge
{
return personAge;
}
-(void)setPersonAge:(int)age
{
personAge = age;
}
2.聲明property的文法為:@property (參數1,參數2) 類型 名字;
eg:
@property (readwrite,copy)NSString *personName;
其中參數主要分為3類:
<1>.訪問器控制:(readwrite/readonly)
<2>.記憶體管理:(assign/retain/copy/strong/weak/unsafe_unretained)
<3>.原子性:(atomicity/nonatomic)
readwrite
聲明此屬性為讀寫屬性,即可以訪問設定方法(setter),也可以訪問擷取方法(getter),與readonly互斥。
readonly
聲明此屬性為唯讀屬性,只能訪問此屬性對應的擷取方法(getter),與readwrite互斥。
assign
預設類型,用於實值型別(int、float、double和NSInteger,CGFloat等表示單純的複製),還包括不存在所有權關係的對象(常見的如delegate),聲明在setter方法中,採用直接賦值來實現設值操作。eg:
-(void)setPersonName:(NSString *)name
{
personName = name;
}
retain
意味著執行個體變數要擷取傳入參數的所有權,聲明在setter方法中,需要對設過來的值進行retain 加1操作。eg:
-(void)setPersonName:(NSString *)name
{
if (personName != name)
{
[personName release];
personName = [name retain];
}
personName = name;
}
copy
調用此執行個體的copy方法,設定複製後的對象。實現參考retain。
strong
是在ARC伴隨IOS引入的時候引入的關鍵字是retain的一個可選的替代。表示執行個體變數對傳入的參數要有所有權關係即強引用。strong跟retain的意思相同併產生相同的代碼,但是語意上更好更能體現對象的關係。
weak
與assign的效果相似,不同的是weak在對象被回收之後自動化佈建為nil。而且weak智能用在iOS 5或以後的版本,對於之前的版本,使用unsafe_unretained。
unsafe_unretained
weak的低版本替代。
nonatomic
在預設的情況下,通過synthesized 實現的 setter與getter都是原子性訪問的。
多線程同時訪問時,保障存取方法同時只被訪問一個線程訪問,eg:
[ _internal lock ]; // lock using an object-level lock
id result = [ [ value retain ] autorelease ];
[ _internal unlock ];
return result;
但如果設定nonatomic時,屬性的訪問為非原子性訪問,但訪問速度比atomic快,在單線程和明確只有一個線程訪問的情況下廣泛使用。
[email protected]
對於下面的@propety
@property (nonatomic, copy) NSString *personName;
預設合成的規則為:
@synthesize personName = _personName;
其中_personName是編譯器自動幫我們建立的;
@synthesize 中也可以定義 與變數名不相同的getter和setter的命名,籍此來保護變數不會被不恰當的訪問。
Objective-C中的@property和@synthesize用法