@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
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新值,如下程式碼:
- -(void) setObj:(ClassX*) value
- {
- if (obj != value)
- {
- [obj release];
- obj = [value retain];
- }
- }
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和其子類