1. 程式人生 > >@property (nonatomic,retain)中的nonatom和retain的意思

@property (nonatomic,retain)中的nonatom和retain的意思

原文地址

原來簡單解釋過屬性定義(Property) ,並且提起了簡單的retain,copy,assign的區別。那究竟是有什麼區別呢?

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 是內容拷貝。哇,比想象的簡單多了…

------------------------------------------------------------------------------------------------------

上面這篇文章來自:http://c.gzl.name/archives/339

常在宣告一些成員變數時會看到如下宣告方式:

@property (引數1,引數2) 型別 名字;

這裡我們主要分析在括號中放入的引數,主要有以下三種:

setter/getter方法(assign/retain/copy)
讀寫屬性(readwrite/readonly)
atomicity(nonatomic)

其中各引數說明如下:

assign
預設型別,setter方法直接賦值,而不進行retain操作
retain
setter方法對引數進行release舊值,再retain新值,如下程式碼:

  1. -(void) setObj:(ClassX*) value  
  2. {  
  3.          if (obj != value)  
  4.          {  
  5.                    [obj release];  
  6.                    obj = [value retain];  
  7.          }  
copy
setter方法進行Copy操作,與retain一樣
nonatomic

@property (nonatomic,retain)中的nonatom和retain是什麼意思

@property是一個屬性訪問宣告,擴號內支援以下幾個屬性:
1,getter=getterName,setter=setterName,設定setter與getter的方法名
2,readwrite,readonly,設定可供訪問級別
2,assign,setter方法直接賦值,不進行任何retain操作,為了解決原型別與環循引用問題
3,retain,setter方法對引數進行release舊值再retain新值,所有實現都是這個順序(CC上有相關資料)
4,copy,setter方法進行Copy操作,與retain處理流程一樣,先舊值release,再Copy出新的物件,retainCount為1。這是為了減少對上下文的依賴而引入的機制。
5,nonatomic,非原子性訪問,不加同步,多執行緒併發訪問會提高效能。注意,如果不加此屬性,則預設是兩個訪問方法都為原子型事務訪問。鎖被加到所屬物件例項級。


@synthesize xxx;  為這個心屬性自動生成讀寫函式;

如果你不懂怎麼使用他們,那麼就這樣 ->

  • 使用assign: 對基礎資料型別 (NSInteger,CGFloat)和C資料型別(int, float, double, char, 等等)
  • 使用copy: 對NSString
  • 使用retain: 對其他NSObject和其子類