前段时间遇见了个挺有意思的情况、在我无聊重做一遍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:方法。所以崩溃了。
补充一点:=(赋值符号都是浅拷贝);
网友评论