天天看點

屬性項目的定義(property)copy&retain的差別

原文連結: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是一個非常好的選擇。

繼續閱讀