为什么NSSTring对象用copy修饰

相信有很多人都有这个疑惑,为什么NSString对象用copy修饰?其实NSString也是可以用strong修饰的但是最好还是选择copy,为啥呢 ?请看下面的解释
copy的意思是对值进行拷贝,分为浅拷贝与深拷贝,深拷贝会产生一个新对象;
strong是强引用,对象指针指向的是同一个,不会产生新对象;
我们先来看一个例子

@property (nonatomic, strong) NSMutableString *strStrong;
@property(nonatomic, copy) NSmutableString *strCopy;
NSMutableString *name = [[NSMutableString alloc] initWithString: @"hello"];
self.strStrong = name;
self.strCopy = name;
//1.此时给name拼接一个字符
[name appendString: @"word"];
NSLog(@"%@ %p", name, name);
NSLog(@"%@ %p", self.strStrong, self.strStrong);
NSLog(@"%@ %p", self.strCopy, self.strCopy);
结果为:
helloword 0x6000002495d0
helloword 0x6000002495d0
hello     0xa00006f6c6c65685

2.给self.strStrong拼接一个字符
[self.strStrong appendString: @"!!!!"];
NSLog(@"%@ %p", name, name);
NSLog(@"%@ %p", strStrong, strStrong);
NSLog(@"%@ %p", strCopy, strCopy);
结果为:
helloword!!!! 0x60400025d790
helloword!!!! 0x60400025d790
hello            0xa00006f6c6c65685

可以看出,用strong修饰的属性strStrong,随着name值的变化,也跟着变化,然而copy修饰的值就没有发生变化,更加安全。
使用copy,主要是为了防止当NSMutableString赋值给NSString时,两者之一变化,都会引起另外一个值变化。

下面讲一下深拷贝与浅拷贝

    NSString *copy = @"apple";
    NSString *copyString1 = [copy copy];//原对象
    NSString *copyMuStr1 = [copy mutableCopy];//产生新的对象
    NSLog(@"%p %p %p", copy, copyString1, copyMuStr1);
    //0x1034c2118 0x1034c2118 0x60400025f5c0
    
    NSMutableString *mutabStr = [NSMutableString stringWithString:@"watermelon"];
    NSString *copyStr2 = [mutabStr copy];//产生新的对象
    NSString *copyMuStr2 = [mutabStr mutableCopy];//产生新的对象
    NSLog(@"%p %p %p", mutabStr, copyStr2, copyMuStr2);
    //0x600000247800 0x60000003fd40 0x600000247530
AAC3A81E1115A66FBDAA1966DD89CE89.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容