網頁

2013年2月25日 星期一

@property 和 @synthesize 在搞啥?

[iphone app 開發]


@property

照上篇

一行一行講:iphone app dev 中 .h 在做什麼


裡面提到的,@property 會讓編譯器知道,後面將會宣告一個內容,而接在@property 後面的(A , B) 將會填上一些屬性。


ex:  @property (nonatomic, retain) IBOutlet UIPickerView *emailPicker;

而我們所謂的屬性有 @property (AB)
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];//取得新傳進來的直的所有權。
  }

}



















沒有留言:

張貼留言