assign:指定setter方法用簡單的賦值,這是默認操作。你可以對標量類型(如int)使用這個屬性。你可以想象一個float,它不是一個對象,所以它不能retain、copy。
assign:簡單賦值,不更改索引計數(Reference Counting).使用assign: 對基礎數據類型 (NSInteger)和C數據類型(int, float, double, char,等)
retain:指定retain應該在後面的對象上調用,前一個值發送一條release消息。你可以想象一個NSString實例,它是一個對象,而且你可能想要retain它。
retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數爲1 ,使用retain: 對其他NSObject和其子類 ,retain,是說明該屬性在賦值的時候,先release之前的值,然後再賦新值給屬性,引用再加1。
copy:指定應該使用對象的副本(深度複製),前一個值發送一條release消息。基本上像retain,但是沒有增加引用計數,是分配一塊新的內存來放置它。copy是創建一個新對象,retain是創建一個指針,引用對象計數加1。copy: 建立一個索引計數爲1的對象,然後釋放舊對象,copy是創建一個新對象,retain是創建一個指針,引用對象計數加1。
readonly:將只生成getter方法而不生成setter方法(getter方法沒有get前綴)。
readwrite:默認屬性,將生成不帶額外參數的getter和setter方法(setter方法只有一個參數)。
atomic:對於對象的默認屬性,就是setter/getter生成的方法是一個原子操作。如果有多個線程同時調用setter的話,不會出現某一個線程執行setter全部語句之前,另一個線程開始執行setter的情況,相關於方法頭尾加了鎖一樣。
nonatomic:不保證setter/getter的原子性,多線程情況下數據可能會有問題。nonatomic,非原子性訪問,不加同步,多線程併發訪問會提高性能。先釋放原先變量,再將新變量 retain然後賦值;
注意,如果不加此屬性,則默認是兩個訪問方法都爲原子型事務訪問。