iOS中关于copy

作者: binge | 来源:发表于2016-08-27 11:21 被阅读45次

    最近在开发中遇到一个小bug,bug引起的原因是我在声明一个属性时对一个NSMutableString类型的数据使用了copy,但是赋值的是个NSString类型的值,接下来我调用了可变字符串的拼接方法。造成了崩溃。

    @property (nonatomic, copy)NSMutableString *name;
    

    接下来分析崩溃的原因。
    在平时的开发中一般对于NSString这种常见的类型使用strong或者copy就行修饰,如无特别要求两者皆可用。但毕竟是两种不同的类型,还是有差异的:

    • strong的情况下默认生成的setter方法如下
    -(void)setName:(NSString *)name{
        _name = name;
    }
    
    • copy情况下生成的setter方法如下
    - (void)setName:(NSString *)name{
        _name = [name copy];
    }
    

    这时我在我的代码中给name属性赋值

    NSMutableString *str = [NSMutableString stringWithFormat:@"bin"];
        Dog *dog = [[Dog alloc] init];
        dog.name = str;
    

    在使用strong的情况下直接是把str赋值给了dog的name变量。此时如果我在别处改动str将会造成dog的name随之改变,因为他们指向同一份内存。但是我如果使用的是copy,就会执行copy特征的setter方法。此时dog的name变量获取的仅仅是str进行copy后的一个不可变副本。即使改动了str也不会造成dog的name改变。相比这也是苹果写的所有属性中字符产用copy的原因吧。但是如果赋值的数据str不是可变字符串这里strong和copy效果一样。

    还回到我的崩溃原因,由于我用的copy,所以不管你给我传入的可变还是不可变,我接收到的肯定都是不可变的,但是我又在属性处写的NSMutableString。造成 一种我一定是可变字符串的假象,这时候如果我不小心调用了一些仅有不可变字符串才有的方法就会抛出异常。
    所以建议如果是NSMutableString用strong,因为如果是strong的话如果你传入的值是NSString,直接Xcode会有个警告提醒你传值有问题,早发现早治疗。

    相关文章

      网友评论

        本文标题:iOS中关于copy

        本文链接:https://www.haomeiwen.com/subject/yxzzsttx.html