为什么NSString的属性一般使用copy

当属性类型为NSString *时,我们经常使用copy来保护其封装性。那么为什么这么做呢,我的习惯就是上代码,因为我觉得代码能够说明一切。O(∩_∩)O哈哈~

废话不说,我们看代码:

//声明一个字符串str1
@property (nonatomic, strong) NSString *str1;  //这里是strong


//1.我们新创建一个可变字符串str2
NSMutableString *str2 = [NSMutableString stringWithFormat:@"str2"];
//2.把str2值赋给self.str1
self.str1 = str2;
//3.然后我们改变str2的值
[str2 appendString:@"这是添加的"];

//打印结果
NSLog(@"str1=%@",self.str1);
NSLog(@"str2=%@",str2);

我们看下打印结果:

QQ20160613-0.png

str1居然随着str2的改变而变化了!!!

为什么会这样?

因为如果设置成strong的话,str1setter实现是这样的:

- (void)setStr1:(NSString *)str1 {
    _str1 = str1;
}

也就是说,str1str2两个指针指向同一个对象,一个变化,就会引起另外一个的改变。

如果我们把属性设置为copyseeter方法的实现就变成了下面的状况:

- (void)setStr1:(NSString *)str1 {
    _str1 = [str1 copy];
}

然后我们再次打印结果:

copy.png

就正确了

你可能感兴趣的:(为什么NSString的属性一般使用copy)