NSSting 為什么用copy

NSSting大部分的時(shí)候copy, 那么用copy和strong/retain有什么區(qū)別呢?

@interface ViewController ()
@property (strong,nonatomic) NSString *strStrong;
@property (copy, nonatomic)   NSString *strCopy;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 測(cè)試string
    NSMutableString *tempString = [NSMutableString stringWithFormat:@"hello"];
    self.strCopy = tempString;
    self.strStrong = tempString;
    
    NSLog(@"tempString: 字符串地址:%p, 指針地址:%p, 值:%@", tempString, &tempString, tempString);
    NSLog(@"strStrong: 字符串地址:%p, 指針地址:%p, 值:%@", _strStrong, &_strStrong, _strStrong);
    NSLog(@"strCopy: 字符串地址:%p, 指針地址:%p, 值:%@", _strCopy, &_strCopy, _strCopy);
    
    // 改變tempString
    [tempString appendString:@" world"];
    NSLog(@"改變后: \n\n");
    NSLog(@"tempString: 字符串地址:%p, 指針地址:%p, 值:%@", tempString, &tempString, tempString);
    NSLog(@"strStrong: 字符串地址:%p, 指針地址:%p, 值:%@", _strStrong, &_strStrong, _strStrong);
    NSLog(@"strCopy: 字符串地址:%p, 指針地址:%p, 值:%@", _strCopy, &_strCopy, _strCopy);
控制臺(tái)輸出:
2016-10-24 13:00:09.328308 NSString[2069:826291] tempString: 字符串地址:0x170269080, 指針地址:0x16fda1f48, 值:hello
2016-10-24 13:00:09.328447 NSString[2069:826291] strStrong: 字符串地址:0x170269080, 指針地址:0x10020a3c8, 值:hello
2016-10-24 13:00:09.328601 NSString[2069:826291] strCopy: 字符串地址:0xa00006f6c6c65685, 指針地址:0x10020a3d0, 值:hello
2016-10-24 13:00:09.328669 NSString[2069:826291] 改變后:
2016-10-24 13:00:09.328810 NSString[2069:826291] tempString: 字符串地址:0x170269080, 指針地址:0x16fda1f48, 值:hello world
2016-10-24 13:00:09.328959 NSString[2069:826291] strStrong: 字符串地址:0x170269080, 指針地址:0x10020a3c8, 值:hello world
2016-10-24 13:00:09.329028 NSString[2069:826291] strCopy: 字符串地址:0xa00006f6c6c65685, 指針地址:0x10020a3d0, 值:hello

可以看到strCopy新產(chǎn)生了一個(gè)string的副本, 當(dāng)改變tempString的時(shí)候不會(huì)影響到
strCopy, 而strStrong只是一個(gè)新增了一個(gè)指針指向tempString所指向的string.改變tempString, strStrong會(huì)跟著變化.
正常情況下我們都希望當(dāng)tempString改變的時(shí)候, self的string不會(huì)跟著變化, 所以我們一般用copy來(lái)設(shè)置string的屬性.但是如果希望字串的值跟著賦值的字串的值變化,可以使用strong或者retain.
注意:上面的情況是針對(duì)于當(dāng)把NSMutableString賦值給NSString的時(shí)候,才會(huì)有不同,如果是賦值是NSString對(duì)象,那么使用copy還是strong/retain,結(jié)果都是一樣的,因?yàn)镹SString對(duì)象本身就不能改變值.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容