先看看以下两段代码。
第一段:修饰符为strong
@property (strong,nonatomic) NSMutableString *stringMutable;
- (void)testCopyAndStrong1
{
NSMutableString *tempString = [NSMutableString string];
self.stringMutable = tempString;
[tempString appendString:@"111"];
NSLog(@"%@--%@",self.stringMutable,tempString);
}
第二段:修饰符为copy
@property (copy,nonatomic) NSMutableString *stringMutable;
- (void)testCopyAndStrong2
{
NSMutableString *tempString = [NSMutableString string];
self.stringMutable = tempString;
[tempString appendString:@"111"];
NSLog(@"%@--%@",self.stringMutable,tempString);
[self.stringMutable appendString:@"222"];
}
第一段打印:111--111
第二段打印:--111,并崩溃
工作中,一般设置不可变字符串、数组、字典的修饰符为copy,可变的为strong。copy是在属性的setter里执行了一步copy操作,strong是对对象的引用计数+1。由以上两段代码看出,当属性为可变,如果使用一个可变对象对其进行赋值时,所声明的属性都出现了意料之外的变化。第一段中strong修饰之后,self.stringMutable会随着tempString的改变而改变,第二段中copy修饰之后,self.stringMutable在被赋值后变为了不可变类型(深拷贝),再对其添加可变方法就会崩溃。
所以,可变类型必须要用strong修饰,但strong同样存在问题,需要在实际工作中根据相应的业务做处理。