我們?cè)诼暶饕粋€(gè)NSString屬性時(shí)坪它,對(duì)于其內(nèi)存相關(guān)特性猖吴,通常有兩種選擇(基于ARC環(huán)境):strong與copy。那這兩者有什么區(qū)別呢吩翻?
當(dāng)源字符串是NSString時(shí),由于字符串是不可變的锥咸,所以狭瞎,不管是strong還是copy屬性的對(duì)象,都是指向源對(duì)象搏予,copy操作只是做了次淺拷貝脚作。
當(dāng)源字符串是NSMutableString時(shí),strong屬性只是增加了源字符串的引用計(jì)數(shù)缔刹,而copy屬性則是對(duì)源字符串做了次深拷貝,產(chǎn)生一個(gè)新的對(duì)象劣针,且copy屬性對(duì)象指向這個(gè)新的對(duì)象校镐。另外需要注意的是,這個(gè)copy屬性對(duì)象的類型始終是NSString捺典,而不是NSMutableString鸟廓,因此其是不可變的。
這里還有一個(gè)性能問題襟己,即在源字符串是NSMutableString引谜,strong是單純的增加對(duì)象的引用計(jì)數(shù),而copy操作是執(zhí)行了一次深拷貝擎浴,所以性能上會(huì)有所差異员咽。而如果源字符串是NSString時(shí),則沒有這個(gè)問題贮预。
所以贝室,在聲明NSString屬性時(shí),到底是選擇strong還是copy仿吞,可以根據(jù)實(shí)際情況來定滑频。不過,一般我們將對(duì)象聲明為NSString時(shí)唤冈,都不希望它改變峡迷,所以大多數(shù)情況下,我們建議用copy你虹,以免因可變字符串的修改導(dǎo)致的一些非預(yù)期問題绘搞。
實(shí)例:
在iOS開發(fā)中,我們?cè)诙x一個(gè)NSString的時(shí)候都會(huì)用copy來修飾,
@property (nonatomic, copy)NSString *str;
那為什么不用strong呢,我寫了一個(gè)測(cè)試,來簡單的說明一下
首先把修飾符寫成strong
在viewDidLoad的方法中,定義一個(gè)可變的字符串
@property (nonatomic, strong)NSString *str;
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *string = [NSMutableString string];
[string appendString:@"hello"];
self.str = string;
NSLog(@"%@",self.str);
[string appendString:@"World"];
NSLog(@"%@",self.str);
}
輸出的結(jié)果是
NSString中copy的問題[3807:239891] hello
NSString中copy的問題[3807:239891] helloWorld
我們只給self.str附了一次值,但是self.str 的值改變了,這是因?yàn)榘芽勺冏址牡刂分赶蛄藄tr,所以string的值改變了,self.str也跟著改變,
我們把strong改成copy以后
@property (nonatomic, copy)NSString *str;
輸出的結(jié)果
NSString中copy的問題[3852:242597] hello
NSString中copy的問題[3852:242597] hello
- 輸出的結(jié)果顯示,self.str的值只做了一次的修改,
這樣就能保證了在代碼中,數(shù)據(jù)的安全