copy和mutableCopy

拷贝:赋值一个对象会变成另外一个对象。

深拷贝:复制对象,并且复制对象里面的内容,完全拷贝。
浅拷贝:指针拷贝,只拷贝对象,不拷贝对象里面的内容。

判断是不是深拷贝,主要是看是不是拷贝了里面的内容。

copy
mutableCopy 系统自带的都属于浅拷贝

实现深拷贝的方法
1、可以自定义拷贝(根据具体拷贝内容的实现)
2、系统提供给了深拷贝的构造方法
(1)数组 -( instancetype)initWithArray:(NSArray<ObjectType>)array  copyItems:(BOOL)flag
  (2)字典 -( instancetype)initWithDictionary:(NSDictionary<KeyType,ObjectType>)otherDictionary copyItems:(BOOL)flag

自定义拷贝
1、copyWithZone:
2、mutableCopyWithZone

并不是所有的类型都可以copy,如果想让不可以拷贝的实现拷贝,则需自定义
可以拷贝的数据类型:字符串、字典、数组
并不是所有的对象都可以拷贝,只有遵守拷贝协议的的对象才可以拷贝
拷贝协议<NSCopying,NSMutableCopying>

创建一个以NSObject为父类的类,在这个类里面创建自定义拷贝
在.h文件中导入拷贝协议
声明要拷贝对象的属性@property(nonatomic,retain)NSMutableArray *list;//如果想让list成为一个可变的数组,需要将copy变成retain,因为copy之后的对象永远是一个不可变的对象。
在.m文件中实现自定义拷贝的方法
-(id)copyWithZone:(nullable NSZone *)zone{
创建一个拷贝对象
XX *xx = [[XX allocWithZone:zone]init];
xx.属性 = [self.属性 copy];
return xx;
}
//allocWithZone在执行copy的时候分配内存 new是拷贝之后的对象

-(id)mutableCopyWithZone:(nullable NSZone *)zone{
创建一个拷贝对象
XX *xx = [[XX allocWithZone:zone]init];
xx.属性 = [self.属性 mutableCopy];
return xx;
}

mutableCopy是深拷贝还是浅拷贝
指针拷贝是浅拷贝
对象拷贝是深拷贝
mutableCopy->深拷贝 在使用mutableCopy拷贝后,两个对象的内存地址不一样
mutableCopy->浅拷贝 拷贝对象的内容的内存地址是否发生改变

copy 拷贝后的对象是不可变的对象
mutableCopy 拷贝后的对象是可变的,必须要有可变的对象去接收
想要把考被后的对象变成可变的,必须用可变的数据类型去接受。

不可变对象copy—>生成不可变的对象—>不管用可变或者不可变类型接收,都是不可变。
可变的对象copy—>生成不可变的对象—>不管用可变或者不可变类型接收,都是不可变。

不可变对象mutable—>可变的对象—>不可变对象接收—>不可变对象
不可变对象mutable—>可变的对象—>可变对象接收—>可变对象
可变对象mutable—>可变的对象—>不可变对象接收—>不可变对象
可变对象mutable—>可变的对象—>可变对象接收—>可变对象

只要使用copy就是不可变
使用mutable必须使用可变的类型接收才是可变对象

重点:1、分清copy和mutableCopy
           2、记住深浅拷贝的含义、区别
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值