Objective-C語言關鍵詞,與@synthesize配對使用。
功能:讓編譯器自動編寫一個與數據成員同名的方法聲明來省去讀寫方法的聲明。
說白了,就是java中的getter setter方法。
聲明property的語法為:
@property (參數1,參數2) 類型 名字;
如:@property(nonatomic,retain) UIWindow *window;
其中參數主要分為三類:
讀寫屬性: (readwrite/readonly)
setter語意:(assign/retain/copy)
原子性: (atomicity/nonatomic)
各參數意義如下:
readwrite
產生setter\getter方法
readonly
只產生簡單的getter,沒有setter。
assign
默認類型,setter方法直接賦值,而不進行retain操作
retain
setter方法對參數進行release舊值,再retain新值。
copy
setter方法進行Copy操作,與retain一樣
nonatomic
禁止多線程,變量保護,提高性能。
assign 通常用於基本類型,如int,bool,char等。
copy 通常用於NSString,NSNumber,NSArray等不變的類型。
retain 一般的NSObject 都用這個。
下面解釋一下NSString類型的變量的setter方法為什麼要用copy.直接上代碼:
@interface
Person
@property
(nonatomic,
retain) NSString
*name;
@end
Person
*p = [[Person alloc] init];
NSMutableString
*name = [[NSMutableString
alloc] initWithString:@"hello"];
p.name
= name;
[name
appendString:@"
world"];
NSLog(@"%@",
p.name); //
此時p.name已變成hello world, 這不是我們想要的。
如果
@interface
Person
@property
(nonatomic,
copy)
NSString
*name;
@end
Person
*p = [[Person alloc] init];
NSMutableString
*name = [[NSMutableString
alloc] initWithString:@"hello"];
p.name
= name;
[name
appendString:@"
world"];
NSLog(@"%@",
p.name); //
此時p.name仍為hello, 這是正確的。
NSString類型變量的值是不會發生變化的,但變量的內存地址是會發生變化的。copy的用法是復制內容,並且新分配一塊內存地址。而retain則是將輸入參數的內存地址復制一份,賦給成員變量。所以copy和retain的區別在於,如果傳入的參數是NSMutableString類型的話,這個參數一旦發生變化,成員變量的內容也會發生變化;而用copy,則不會發生這種情況(因為兩者的內存地址完全不同)。如果傳入的參數是NSString,則用copy和retain的效果完全一樣,沒什麼分別。所以NSString、NSArray等不可變的類型建議用copy。
以上代碼來自cocoachina