前言
以前讀書看到@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 來使用。