您的位置:首页 > 职场人生

黑马程序员-IOS-OC基础-浅析Copy语法

2014-04-20 23:38 417 查看
在OC语法中,提供了Copy语法(Copy + MutableCopy)用于对象的拷贝。其中很容易混淆的是浅拷贝和深拷贝。

所谓浅拷贝,即是地址拷贝,并不产生新的对象,而是对原对象的引用计数值加1。而深拷贝,即是对象拷贝,产生新的对象副本,计数器为1。

下面通过一个例子来分析一下这个比较容易乱的Copy:

一、对于NSString/NSMutableString; NSArray/NSMutableArray... 这OC提供的类对象:

以NSString/NSMutableString为例:

对于copy,返回的一定是不可变类型;而mutableCopy,返回的一定是可变类型。

①对于 mutableCopy ,一定是深拷贝。

②对于
copy:

如果是 NSString ---> NSString;则是浅拷贝;如果是 NSMutableString ---> NSString;则是 深拷贝

如果是 NSString 、NSMutableString ---> NSMutableString;则是深拷贝

注:只有一种情况下是发生浅拷贝:不可变对象 复制到 不可变对象。

?
除了以上这种情形外,其他都是深拷贝。

例如:

?
二、对于自定义对象的Copy:该类必须实现NSCopying协议,重写 copyWithZone 方法。

同理,对于自定义对象的mutableCopy:必须实现 NSMutableCopying 协议,重写 mutableCopyWithZone 方法。

在NSCopying协议中,其实只有一个协议方法:

?
在NSMutableCopying协议:

?
下面给出一个例子:

?
?
?
加入对于某些自定义对象是不可变的,那么如何办呢?

?
这样,输出的两个对象的地址就是相同的了。

下面了解一下关于如果某一个自定义类继承了 这个Person类的情况。

如果某一个子类继承了实现了NSCopying协议的基类,那么该子类也是会自动继承这个协议的方法。但是需要自己重新实现。

例如:有一个Student子类继承了这个Person类:

?
?
注意其中copyWithZone方法的实现。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: