原文連結:http://c.gzl.name/archives/85
@property (copy, nonatomic) NSString *title;
什麼是assign,copy,retain之間的差別?
- assign : 簡單指派,不更改索引計數(Reference Counting)。
- copy : 建立一個索引計數為1的對象,然後釋放舊對象
- retain :釋放舊的對象,将舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
retain的實際文法為:
- (void)setName:(NSString *)newName {
if (name != newName) {
[name release];
name = [newName retain];
// name’s retain count has been bumped up by 1
}
}
說了那麼麻煩,其實接下來的話最重要:
如果你不懂怎麼使用他們,那麼就這樣 ->
- 使用assign: 對基礎資料類型 (NSInteger,CGFloat)和C資料類型(int, float, double, char, 等等)
- 使用copy: 對NSString
- 使用retain: 對其他NSObject和其子類
Copy,retain的差別?
assign就不用說了,因為基本上是為簡單資料類型準備的,而不是NS對象們。
Retain vs. Copy!!
- copy : 建立一個索引計數為1的對象,然後釋放舊對象
- retain :釋放舊的對象,将舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1
那上面的是什麼該死的意思呢?
Copy其實是建立了一個相同的對象,而retain不是:
比如一個NSString 對象,位址為0×1111 ,内容為@”STR”
Copy 到另外一個NSString 之後,位址為0×2222 ,内容相同,新的對象retain為1 ,舊有對象沒有變化
retain 到另外一個NSString 之後,位址相同(建立一個指針,指針拷貝),内容當然相同,這個對象的retain值+1
也就是說,retain 是指針拷貝,copy 是内容拷貝。哇,比想象的簡單多了…
nonatomic關鍵字:
atomic是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成資料錯誤。而這種機制是耗費系統資源的,是以在iPhone這種小型裝置上,如果沒有使用多線程間的通訊程式設計,那麼nonatomic是一個非常好的選擇。