美文网首页oc基础
iOS开发 copy修饰符作用

iOS开发 copy修饰符作用

作者: 隔壁班小明 | 来源:发表于2018-07-09 12:17 被阅读183次

    前段时间遇见了个挺有意思的情况、在我无聊重做一遍copy修饰符的实验的时候写了下面的代码:

    @property (nonatomic, copy) NSMutableString * objStr;
    
    NSMutableString * str = [[NSMutableString alloc]init];
        [str appendString:@"1"];
        _objStr = str;
        [str appendString:@"2"];
        NSLog(@"%p", _objStr);
        NSLog(@"%p", str);
    
    

    然后大家说说输出什么?
    当时我想的是输出的地址是不一样的(%p是输出地址),结果呢,两个地址完全一样。脑袋一懵,copy不是重新复制一份吗?想了半天才发现自己写错了。
    copy修饰符是在set方法里面起作用的,我用_objStr = str;完全不走set方法所以两个完全一样的。这个估计很多人都忽略了。比如写model是属性是copy的字符串,然后赋值的时候没有用self.属性。

    总结一下copy吧。
    copy的实现

    - (void)setObjStr: (NSString*)objStr{
          [_ objStr release];   //把_ objStr以前的对象release一次
          _ objStr = [objStr copy]; // 把objStr 的对象拷贝一份给_ objStr
    }
    

    copy的特点,会生成一个不可变的对象(如果是可变的,set里面应该用mutableCopy了),举个例子还是上面的代码修改一下,这次我用self.了。

    @property (nonatomic, copy) NSMutableString * objStr;
    
    NSMutableString * str = [[NSMutableString alloc]init];
        [str appendString:@"1"];
        self.objStr = str;
        [str appendString:@"2"];
        str = [NSMutableString stringWithString:@"3"];
    
        NSMutableString * str2 = _objStr;
        [str2 appendString:@"3"];
    
        NSLog(@"%p", str2);
        NSLog(@"%p", _objStr);
        NSLog(@"%p", str);
    

    会怎么样呢?会崩溃,str2是浅拷贝_objStr,因为_objStr是不可变的字符串,不能调用appendString:方法。所以崩溃了。

    补充一点:=(赋值符号都是浅拷贝);

    相关文章

      网友评论

        本文标题:iOS开发 copy修饰符作用

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