[ios]@property 屬性中 assign,nonatomic,retain,strong,weak的區(qū)別

@property 屬性中 assign,nonatomic,retain,strong,weak的區(qū)別

atomic:默認(rèn)是有該屬性的,這個(gè)屬性是為了保證程序在多線程情況下,編譯器會(huì)自動(dòng)生成一些互斥加鎖代碼,避免該變量的讀寫(xiě)不同步問(wèn)題。

nonatomic:如果該對(duì)象無(wú)需考慮多線程的情況,請(qǐng)加入這個(gè)屬性,這樣會(huì)讓編譯器少生成一些互斥加鎖代碼,可以提高效率。

copy : 建立一個(gè)索引計(jì)數(shù)為1的對(duì)象,然后釋放舊對(duì)象

retain :釋放舊的對(duì)象,將舊對(duì)象的值賦予輸入對(duì)象,再提高輸入對(duì)象的索引計(jì)數(shù)為1

Copy其實(shí)是建立了一個(gè)相同的對(duì)象,而retain不是:

比如一個(gè)NSString 對(duì)象,地址為0×1111 ,內(nèi)容為@”STR”

Copy 到另外一個(gè)NSString 之后,地址為0×2222 ,內(nèi)容相同,新的對(duì)象retain為1 ,舊有對(duì)象沒(méi)有變化

retain 到另外一個(gè)NSString 之后,地址相同(建立一個(gè)指針,指針拷貝),內(nèi)容當(dāng)然相同,這個(gè)對(duì)象的retain值+1

也就是說(shuō),retain 是指針拷貝,copy 是內(nèi)容拷貝。

使用assign: ?對(duì)基礎(chǔ)數(shù)據(jù)類(lèi)型 (NSInteger,CGFloat)和C數(shù)據(jù)類(lèi)型(int, float, double, char, 等等)

使用copy: ?對(duì)NSString

使用retain: 對(duì)其他NSObject和其子類(lèi)

strong 與weak

strong關(guān)鍵字與retain關(guān)似,用了它,引用計(jì)數(shù)自動(dòng)+1

代碼示例:

@property (nonatomic, strong) NSString *string1;

@property (nonatomic, strong) NSString *string2;

self.string1 = @"String 1";

self.string2 = self.string1;

self.string1 = nil;

NSLog(@"String 2 = %@", self.string2);

輸出結(jié)果是:String 2 = String 1

由于string2是strong定義的屬性,所以引用計(jì)數(shù)+1,使得它們所指向的值都是@"String 1", 如果你對(duì)retain熟悉的話,這理解并不難。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容