@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熟悉的話,這理解并不難。