iOS开发 copy修饰符作用

前段时间遇见了个挺有意思的情况、在我无聊重做一遍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修饰符作用)