@property中的關鍵字說明

前言

以前讀書看到@property理解都不深刻,只是簡單的認爲幫我們做了setter和getter。對其中的幾個關鍵字理解都不到位,今天被坑了,故來標記一下。


關鍵字

atomic

線程保護的,默認。意思是在多線程編程中,對該屬性的訪問具有原子性,不會被cpu時間片切分。

nonatomic

線程不保護的,相反。atomic機制是耗費系統資源的,所以在資源不充裕的設備上,如果沒有使用多線程間的通訊編程,那麼選擇nonatomic就比較好。

assign

直接賦值,不更改引用計數,默認。常用語基礎數據類型(NSInteger,CGFloat)和c數據類型(int ,char ,float...)

retain

保留對象,內部會自動調用retain方法,引用計數+1。常用於NSObject及其之類。

copy

 建立一個引用計數爲1的新對象,並釋放舊對象。常用於NSString。

舉例說明assign和retain:

@property (nonatomic, retain) NSString *str1;   
@property (nonatomic, retain) NSString *str2;


self.str1 = @"String 1";   
self.str2 = self.str1;   
self.str1 = nil;  
NSLog(@"String 2 = %@", self.str1);
輸出結果是String 2 = String 1,由於str是retain定義的屬性,所以引用計數加1。str1和str2都會指向@"String 1"。當str1指向nil時,
並不會影響str2指針指向@"String 1"。
@property (nonatomic, retain) NSString *str1;   
@property (nonatomic, assign) NSString *str2;


self.str1 = @"String 1";   
self.str2 = self.str1;   
self.str1 = nil;  
NSLog(@"String 2 = %@", self.str1);
此時輸出的結果是,String 2 = null,原因是str2是assign定義的屬性,直接賦值,沒有retain內存地址.當Str1釋放了內存,str2也變爲了nil。

readwrite

生成get/set方法,默認。

readonly

只生成get方法。

strong

strong同retain作用一樣。strong和weak是由ARC引入的對象變量屬性,其作用類似於retain和assign。在xcode4.3及以後,自動創建的屬性,
都是默認用strong和weak,而不是assign和retain。

weak

同assign一樣。

unsafe_unretained

unsafe_unretained 就是ios5版本以下的 assign ,也就是 unsafe_unretained , weak, assign 三個都是一個樣的。 
因爲 ios5用的是 weak ,那在ios4.3就用不了,如果你將 weak 修改爲 unsafe_unretained ,那就可以用了。
說到底就是iOS 5之前的系統用該屬性代替 weak 來使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章