天天看點

nonatomic,assign,copy等的解析與運用時機

property是一種代碼生成機制,能夠生成不同類型的getter/setter函數。

用法如:@property (attribute1,attribute2) float value;

一、在MRC中這些attribute包括:

readonly  表示這個屬性是隻讀的,就是隻生成getter方法,不會生成setter方法。 

readwrite 可讀可寫(預設)設定可通路級别。

assign:簡單指派,不更改索引計數。

copy:建立一個索引數為1的對象,然後釋放舊對象。

retain:釋放(release)舊對象,将舊對象的值賦予輸入對象,再提高輸入對象的索引計數為1。

atomic: 是Objc使用的一種線程保護技術,基本上來講,是防止在寫未完成的時候被另外一個線程讀取,造成資料錯誤。而這種機制是耗費系統資源的,是以在iPhone這種小型裝置上,如果沒有使用多線程間的通訊程式設計,那麼nonatomic是一個非常好的選擇。

nonatomic:非原子性通路,不加同步,多線程并發通路會提高性能。注意,如果不加此屬性,則預設是兩個通路方法都為原子型事務通路。

copy其實是建立了一個相同的對象,而retain不是:

比如一個NSString對象,位址為0x1111,内容為@"STR" ,copy到另外一個NSString之後,位址為0x2222,内容相同,新的對象retain為1,舊有對象沒有變化。

retain 到另一個NSString之後,位址相同(建立一個指針,指針拷貝),内容當然相同,這個對象的retain值+1,也就是說,retain是指針拷貝,copy是内容拷貝。在拷貝之前,都會釋放舊的對象。

assign:簡單指派,不更改索引計數(Reference Counting)。

copy:建立一個索引計數為1的對象,然後釋放舊對象

retain:釋放舊的對象,将舊對象的值賦予輸入對象,再提高輸入對象的輸入對象的索引計數為1

 @property (nonatomic,retain)NSString *name; 的實際文法:

-(void)setName(NSString*)newName

{

    if(name!=newName)

    { 

       [name release];

       name=[newName retain]; // name的引用計數has been bumped up by 1;

   }

}

 @property (nonatomic,copy)NSString *name; 的實際文法:

-(void)setName(NSString*)newName

{

    if(name!=newName)

    { 

       [name release];

       name=[newName copy]; // name的引用計數has been bumped up by 1;

   }

}

用法:

      使用assign:對基礎資料類型(NSInteger)和C資料類型(int ,float,double,char等)

      使用copy:對NSString

      使用retain:對其他NSObject和其子類

二、在ARC中,reatin和copy不再使用,改用了Strong和weak

在arc中,如果沒有強指針指向對象,對象就會被釋放。

強指針:預設的情況下,所有的指針都是強指針,關鍵字strong

弱指針:_ _weak關鍵字修飾的指針

聲明一個弱指針如下:

_ _weak Person *p;

ARC中,隻要弱指針指向的對象不在了,就直接把弱指針做清空操作。

_ _weak Person *p=[[Person alloc]  init];//不合理,對象一建立出來就被釋放掉,對象釋放掉後,ARC把指針自動清零。

ARC中在property處不再使用retain,而是使用strong,在dealloc中不需要再[super dealloc]。

@property(nonatomic,strong)Dog *dog;// 意味着生成的成員變量_dog是一個強指針,相當于以前的retain。

如果換成是弱指針,則換成weak,不需要加_ _。

在ARC中@property的說明:

Strong:相當于原來的retain(适用于OC對象類型),成員變量是強指針

Weak:相當于原來的assign,(适用于oc對象類型),成員變量是弱指針

Assign:适用于非OC對象類型(基礎類型)

繼續閱讀