Ios面试复习 -- Copy

OC中的copy :利用一个源对象产生一个副本对象

修改源的属性和行为,不会影响副本对象

修改副本对象的属性和行为,不会影响源对象

1.Copy的使用

一个对象可以调用copy或者mutableCopy 方法来创建一个副本对象

copy:创建的是不可变副本(NSString , NSArray, NSDictionary)

mutableCopy : 创建的是可变副本( NSMutableString , NSMutableArray, NSMutableDictionary)

使用copy功能前提是必须遵守NSCopying 协议 同时实现copywithzone方法,

同理使用mutableCopy 必须遵守NSmutableCopying 协议 和实现mutableCopywithzone方法

2.Copy的注意

--1.不可变对象 调用 Copy ----> 返回 不可变对象 (不会    产生一个新的对象)

因为原来的对象是不能修改的 copy返回的对象也是不可修改的,既然两个对象都不能修改,所以永远不能影响到另外一个对象,所以产生一个新的对象是没有意义的,(OC对内存进行优化,就不会产生一个新的对象)

Ios面试复习 -- Copy_第1张图片
不可变对象 调用copy 示例1
Ios面试复习 -- Copy_第2张图片
不可变对象 调用copy 示例2

--2.可变对象 调用 copy ---->  返回一个不可变对象 (ARC下会产生一个新对象,而MRC下不会产生新对象)

Ios面试复习 -- Copy_第3张图片

具体情况不一一列举 

总结为 

在MRC 下

--1.通过copy 产生的都是不可变对象  通过mutablecopy产生的都是可变对象

--2.copy 不会产生新的对象

在ARC 下

--1.通过copy 产生的都是不可变对象  通过mutablecopy产生的都是可变对象

--2.只有通过copy + 不可变对象 不会产生新的对象 

3.深copy 和 浅copy

--1.若是没有生成一个新的对象,我们称之为浅copy本质就是一个指针copy

--2.若是生成一个新的对象,我们称之为深copy本质会创建一个新的对象

4.copy 在MRC下 内存管理

--1.浅copy 不会生成新的对象

但需要注意的是,浅copy会对以前的源对象进行一次retain  而新返回的对象引用计数和源对象相同

sososo 在释放时,需要对源对象进行一次release

Ios面试复习 -- Copy_第4张图片

--2.深copy 会产生新的对象,不会对源对象进行retain ,而新生成的对象,需要在释放时进行一次release 

你可能感兴趣的:(Ios面试复习 -- Copy)