相信有很多人都有这个疑惑,为什么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
网友评论