如果把一個屬性聲明為weak
編譯器做了一件事,只是給成員變量賦值,而沒有對引用計數進行處理
set方法:
-(void)setName:(NSString *)name
{
if (_name != name)
{
_name = name;
}
}
如果把一個屬性聲明為strong
實際上編譯器做了兩件事,1、處理了引用計數 2、對成員變量賦值
set方法:
-(void)setName:(NSString *)name
{
if (_name != name)
{
//將舊的對象引用計數器減一
[_name release];
//將新的對象引用計數加一
[name retain];
//賦值給成員變量
_name = name;
}
}
以下內容為轉載,出處不詳。
assign:指定setter方法用簡單的賦值,這是默認操作。你可以對標量類型(如int)使用這個屬性。你可以想象一個float,它不是一個對象,所以它不能retain、copy。
retain:指定retain應該在後面的對象上調用,前一個值發送一條release消息。你可以想象一個NSString實例,它是一個對象,而且你可能想要retain它。
copy:指定應該使用對象的副本(深度復制),前一個值發送一條release消息。基本上像retain,但是沒有增加引用計數,是分配一塊新的內存來放置它。
readonly:將只生成getter方法而不生成setter方法(getter方法沒有get前綴)。
readwrite:默認屬性,將生成不帶額外參數的getter和setter方法(setter方法只有一個參數)。
atomic:對於對象的默認屬性,就是setter/getter生成的方法是一個原子操作。如果有多個線程同時調用setter的話,不會出現某一個線程執行setter全部語句之前,另一個線程開始執行setter的情況,相關於方法頭尾加了鎖一樣。
nonatomic:不保證setter/getter的原子性,多線程情況下數據可能會有問題。