Properties (@property )

之前的KVC和KVO中都使用了accessor方法,如果成員變量很多的情況下,不然就得寫下很多的類似的方法? Objective -C在此處就是用了@property來代替:


之前的


@interface AppDelegate : NSObject <NSApplicationDelegate>

{

    int sliderNumber;

}

- (int)sliderNumber;

- (void)setSliderNumber:(int)x;


@property (assign) IBOutlet NSWindow *window;

- (IBAction)incrementSliderNumber:(id)sender;


@end

則就可以改成

@interface AppDelegate : NSObject <NSApplicationDelegate>

{

    int sliderNumber;

}

@property (assign) int sliderNumber;

@property (assign) IBOutlet NSWindow *window;

- (IBAction)incrementSliderNumber:(id)sender;

@end


並且在KVCAppDelegate.m中 也就不用去實現

- (int)sliderNumber;

(void)setSliderNumber:(int)x;這2個方法了,而是替代的寫成@synthesize sliderNumber;


Property的屬性:


一般,property的聲明如下:

@property(attributes)type name;

attributes 可包括readwrite和readonly 兩種,默認的是readwrite,設置爲readonly的就沒有set方法。


描述set方法如何工作,屬性包括下面的一種:

assign (默認) 創建一個賦值語句,這個屬性通常用於標量變量,而非指針類型變量(如整型和浮點型)

strong 強引用類型,讓對象在指針設置時就一直被指向,避免重新分配,特別是ARC,如果沒有使用ARC則與retain屬性相同

weak 若引用,出了在指向的對象被釋放的情況下,property將被設置爲nil(ARC纔有)

copy 創建新值的複製,通常用於字符創或者可變子類情況

retain 參照strong


nonatomic (非原子操作)

atomic       (原子操作)


原子操作: 在多線程的應用程序中,setter方法在一個線程的執行與同一setter方法在另一個線程的執行不會衝突,包括使用了鎖來保證同一時刻只有一個setter方法在執行,創建 和使用鎖會帶來額外的開銷,假如開發者能夠確認accessor方法不需要原子操作,那麼最好使用非原子操作,來減小開銷.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章