@property
照上篇
一行一行講:iphone app dev 中 .h 在做什麼
裡面提到的,@property 會讓編譯器知道,後面將會宣告一個內容,而接在@property 後面的(A , B) 將會填上一些屬性。
ex: @property (nonatomic, retain) IBOutlet UIPickerView *emailPicker;
而我們所謂的屬性有 @property (A, B)
A部分
atomic : 這個在幾乎所有語言裡面都看的到,尤其是linux kernel 中,代表當你要使用後面宣告的內容時,他的動作是不可分割的,也就是將會使用mutex 的方式,讓你在多thread 時,比較安全。(只是比較安全歐!)
nonatomic: 就是上述的相反,意思是在使用後面的宣告(emailPicker ) 時,沒有互斥的保護。
B部分:
readonly: 唯獨。當你希望後面宣告的東西不要被別人改變時。(簡單講就是之後你用@synthesize 時不會幫你做setter 出來。)
retain: 保留。編譯器會保留你傳進來的值,並且在之後有新值被設定後,會拋棄就的值。
readwrite: 可讀寫。當你希望你的東西,能夠提供給其他人使用(不是自己在code 裡操作),這個會讓編譯器做出setter 和 getter 。
copy: 複製。你只是想要得到某個值的copy, 不是操作原本值的時候。
assign: 指定。當你後面宣告的值,只是打算來作最基本的 myvalue=xxx 時,簡單使用,不過通常setter 你都需要改一下。
@synthesize
沒錯,當你在.h 當中設定了上述的 @property (A,B) type wwwwww 之後,你在.m中用
@synthesize wwwwww =xxxxxx_ ; 時,就是在跟編譯器說,請把wwwwww的內容特性
用來支援xxxxxx_這個欄位,所以之後我們不再操作xxxxxx_ 這個原本的欄位,而改用
wwwwww 來操作。 通常wwwwww 和 xxxxxx_ 都是可以自己取名字的,所以為了不要混淆
我都用 @synthesize xxxxxx =xxxxxx_ 來做,在欄位的部份最後加上底線,以此區別。
ex: .h
<UIPickerViewDataSource, UIPickerViewDelegate,MFMailComposeViewControllerDelegate>{
NSArray* activities_;
NSArray* actions_;
UIPickerView *emailPicker_;//為了取得picker view 的內容值
}
.m
@synthesize emailPicker = emailPicker_;
一個getter , setter 的例子
如果在 .h 中宣告
@property (nonatomic , retain) NSString* myField;
在.m 中
@synthesize myField = myField_;
以下是compiler 幫你做的....
//getter, 就是單純回傳值
-(NSString*) myField{
return myField;
}
//setter
-(Void) setmyField: (NSString*) newValue{
if(newValue != myField){
[myField_ release]//就值先放掉
myField_ = [newValue retain];//取得新傳進來的直的所有權。
}
}
如果在 .h 中宣告
@property (nonatomic , retain) NSString* myField;
在.m 中
@synthesize myField = myField_;
以下是compiler 幫你做的....
//getter, 就是單純回傳值
-(NSString*) myField{
return myField;
}
//setter
-(Void) setmyField: (NSString*) newValue{
if(newValue != myField){
[myField_ release]//就值先放掉
myField_ = [newValue retain];//取得新傳進來的直的所有權。
}
}
沒有留言:
張貼留言