文章轉(zhuǎn)自:
https://blog.csdn.net/huang512715681/article/details/73293357
我們大部分的時候NSString的屬性都是copy,那copy與strong的情況下到底有什么區(qū)別呢?我們以實例來說明:
@interfaceViewController()
@property(nonatomic,copy)NSString*str1;
@property(nonatomic,strong)NSString*str2;
@end
然后寫一個測試方法:
-(void)test{
NSMutableString*str=[NSMutableStringstringWithFormat:@"helloworld"];
self.str1=str;
self.str2=str;
NSLog(@"str:%p--%p",str,&str);
NSLog(@"copy_str:%p--%p",_str1,&_str1);
NSLog(@"strong_str:%p--%p",_str2,&_str2);
}
最后我們運行看打印結(jié)果:
2017-06-1515:21:55.910oa[1236:78490]str:0x600000075cc0--0x7fff5bd7c9d8
2017-06-1515:21:55.910oa[1236:78490]copy_str:0x600000026e60--0x7fc66cc06358
2017-06-1515:21:55.911oa[1236:78490]strong_str:0x600000075cc0--0x7fc66cc06360
從打印結(jié)果上我們可以看出str和_str2的對象地址是一樣的爆侣,指向同一個對象萍程,所以它們的值也是一樣的,而str和_str1對象地址不同兔仰,是兩個不同的對象茫负,所以copy是深復制,創(chuàng)建了一個新的對象乎赴。?
現(xiàn)在改變str的值忍法,看看str1和str2有什么變化:
[str appendString:@"hry"];
NSLog(@"****************%@",self.str1);
NSLog(@"****************%@",self.str2);
打印結(jié)果如下:
2017-06-15 15:21:55.911 oa[1236:78490]****************helloworld
2017-06-15 15:21:55.911 oa[1236:78490]****************helloworldhry
從打印結(jié)果可以看出經(jīng)過copy關(guān)鍵字修飾過的str1并沒有因為str的變化而變化,經(jīng)過strong修飾過的str2卻隨str的改變而改變榕吼。?
所以饿序,如果一般情況下,我們都不希望字串的值跟著str變化友题,所以我們一般用copy來設(shè)置string的屬性嗤堰。?
如果希望字串的值跟著賦值的字串的值變化,可以使用strong。
注意:上面的情況是針對于當把NSMutableString賦值給NSString的時候踢匣,才會有不同告匠,如果是賦值是NSString對象,那么使用copy還是strong离唬,結(jié)果都是一樣的后专,因為NSString對象根本就不能改變自身的值,他是不可變的输莺。
把一個對象賦值給一個屬性變量戚哎,當這個對象變化了,如果希望屬性變量變化就使用strong屬性嫂用,如果希望屬性變量不跟著變化型凳,就是用copy屬性。
由此可以看出:?
對源頭是NSMutableString的字符串嘱函,strong僅僅是指針引用甘畅,增加了引用計數(shù)器,這樣源頭改變的時候往弓,用這種strong方式聲明的變量(無論被賦值的變量是可變的還是不可變的)疏唾,它也會跟著改變;而copy聲明的變量,它不會跟著源頭改變函似,它實際上是深拷貝槐脏。
對源頭是NSString的字符串,無論是strong聲明的變量還是copy聲明的變量撇寞,當?shù)诙卧搭^的字符串重新指向其它的地方的時候顿天,它還是指向原來的最初的那個位置,也就是說其實二者都是指針引用重抖,也就是淺拷貝露氮。
另外說明一下,這兩者對內(nèi)存計數(shù)的影響都是一樣的钟沛,都會增加內(nèi)存引用計數(shù)畔规,都需要在最后的時候做處理。
其實說白了恨统,對字符串為啥要用這兩種方式叁扫?我覺得還是一個安全問題,比如聲明的一個NSString *mStr變量畜埋,然后把一個NSMutableString *str變量的賦值給它了莫绣,如果要求mStr跟著str變化,那么就用strong;如果mStr不能跟著str一起變化悠鞍,那就用copy对室。而對于要把NSString類型的字符串賦值給mStr,那兩都沒啥區(qū)別。不會影響安全性掩宜,內(nèi)存管理也一樣蔫骂。