关于Copy和Strong类型修饰符的思考

先看看以下两段代码。

第一段:修饰符为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同样存在问题,需要在实际工作中根据相应的业务做处理。

你可能感兴趣的:(关于Copy和Strong类型修饰符的思考)