strong與weak是由ARC新引入的物件變數屬性。weak 和 strong 屬性只有在你開啟ARC時才會被要求使用。
@strong 和@retain相近
@weak和@assign相近,不過@weak在釋放後多做了賦值為nil操作,這種好處是防止野指標搗亂,其好處,用過的人都知道。
@copy 此屬性只對那些實行了NSCopying協議的物件類型有效。如同深拷貝的意思,開闢出新的記憶體空間,複製內容進記憶體 中,這樣有兩份對象,然後各不相干。
@retain 引用計數加1,讓指標指向已有的記憶體位址,這樣,retain出來的指標指向的地址和原地址相同,提高了引用計數,實際記憶體位址中只有一份資料。採用引用計數的方法
簡單的一句話,@copy深拷貝 @retain淺拷貝
@assign 簡單賦值,不更改索引計數
對基礎資料類型 (例如NSInteger,CGFloat)和C資料類型(int, float, double, char, 等) 適用單一資料型別。特別地,在Objective-c中的delegate的屬性必須設定為@assign (iOS5用@weak) ,其目的是防止循環參考導致的記憶體無法釋放而產生的記憶體泄露。
比如,你用malloc分配了一塊記憶體,並且把它的地址賦值給了指標a,後來你希望指標b也共用這塊記憶體,於是你又把a賦值給(assign)了b。此時a和b指向同一塊記憶體。a不再需要這塊記憶體,能否直接釋放它。如果是@retain 屬性,則通過引用計數的辦法管理記憶體,當引用計數為0 時候釋放,而 用@assign則不能直接釋放a,因為不知道b是否還在用記憶體中的東西,極度危險的操作。
@readonly 唯讀屬性。如果你使用@synthesize關鍵字,也是有讀取器方法(get)被解析。而且如果你試圖使用點操作符為屬性賦值,你將得到一個編譯錯誤。
@readwrite此標記說明屬性會被當成讀寫的,這也是預設屬性
__weak, __strong 用來修飾變數,此外還有 __unsafe_unretained, __autoreleasing 都是用來修飾變數的。
__strong 是預設的關鍵詞。
__weak 聲明了一個可以自動 nil 化的弱引用。
__unsafe_unretained 聲明一個弱應用,但是不會自動nil化,也就是說,如果所指向的記憶體地區被釋放了,這個指標就是一個野指標了。
__autoreleasing 用來修飾一個函數的參數,這個參數會在函數返回的時候被自動釋放。