当属性类型为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);
我们看下打印结果:
str1
居然随着str2
的改变而变化了!!!
为什么会这样?
因为如果设置成strong
的话,str1
的setter
实现是这样的:
- (void)setStr1:(NSString *)str1 {
_str1 = str1;
}
也就是说,str1
和str2
两个指针指向同一个对象,一个变化,就会引起另外一个的改变。
如果我们把属性设置为copy
,seeter
方法的实现就变成了下面的状况:
- (void)setStr1:(NSString *)str1 {
_str1 = [str1 copy];
}
然后我们再次打印结果:
就正确了