1.导言
1).本文目标:为从事iOS开发的朋友介绍对象拷贝的使用场景
2).目标用户:初级或中级iOS开发者
2.什么是copy和mutableCopy
copy,又名浅拷贝:只是复制对象的引用,并没有复制对象的具体内容。
mutableCopy,又名深拷贝:复制了对象的具体内容,并返回对象副本的引用。
进一步解释可以这样去理解:copy方法可以复制可变对象或不可变对象的不可变副本,对于不可变对象副本,其对象的值不可以改变。
mutableCopy方法可以复制可变对象或不可变对象的可变副本,对于可变对象副本其对象是可变的。
3.什么场景下使用二者
举个例子,实际项目中,有个对象,在两个不同的函数中使用了,而这两个函数有可能不是互相等待执行完后再执行下一个。
-(void)sync
{
[self test1:对象];
异步执行[self test2:对象];
}
-(void)test1:(对象);
-(void)test2:(对象);
以上几个函数,在sync中分别调用了test1和test2,而这两个函数都是直接对某个对象直接做了处理。如果sync没有加锁,多次调用后,由于test2是异步执行的,特test1和test2中如果都对对象做了类似remove数组等的操作,此时同一个对象就有可能产生crash现象,或者与预期结果不一样。
这种情况下,最好的方式就是使用mutableCopy方法,深度拷贝对象,互不干扰。
4.具体实践
1.不可变的字符串的copy
NSString*str =@"test1";
NSString*copyStr = [str copy];
NSLog(@"str = %s copyStr= %s",str,copyStr);
NSLog(@"指针地址:str = %@ copyStr= %@",&str,©Str);
输出结果:str =0x113d94034 copyStr=0x113d94034
指针地址:str =0x8fee679e7ba4 copyStr=0x8fee679e7bf3
由此得到对于不可变的字符串的copy,对象的内存地址没有改变,而是指针的地址改变了。
2.可变的字符串的copy
相同的方式我们对NSMutableString进行copy,会得到以下结论:
对于可变字符串的copy,直接拷贝了对象。
3.不可变字符串的mutableCopy
我们对NSString对象进行mutableCopy,默认进行了深拷贝。
4.可变字符串的mutableCopy
我们对NSMutableString对象进行mutableCopy,会进行深拷贝。
5.总结
此外对自定义对象的copy与mutableCopy,大家可以去尝试,网上有很多资料供大家参考。在项目实际开发过程中,针对不对的需求,巧妙使用这两个方法,可以达到事半功倍的效果。
网友评论