property中的關鍵字說明

2021-07-11 11:28:22 字數 1924 閱讀 9669

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

property中的屬性關鍵字

arc下,不顯式指定任何屬性關鍵字時,預設的關鍵字都有哪些?atomic readwrite strong 物件 assgin 基本資料型別 具體比較分析 1 atomic與nonatomic atomic 預設是有該屬性的,這個屬性是為了保證程式在多執行緒情況下,編譯器會自動生成一些加鎖 避免該變...

iOS 的 property中的關鍵字

所有者屬性 我們先來看看與所有權有關係的屬性,關鍵字間的對應關係。屬性值關鍵字 所有權strong strong 有weak weak 無unsafe unretained unsafe unretained 無copy strong 有assign unsafe unretained 無retai...

python關鍵字之 property

學習 python 的時候,經常遇見 property 關鍵字,有時候讓我有點疑惑,所以寫下這篇部落格來記錄它。在繫結屬性時,如果我們直接把屬性暴露出去,雖然寫起來很簡單,但是,沒辦法檢查引數,導致可以隨便更改屬性 舉個例子 class celsius def init self,temperatu...