iOS 深、浅复制及完全深复制

深、浅复制

差别

浅拷贝获得的对象的地址和原有对象的地址一致
而深拷贝返回新的内存地址,并且返回的对象为可变对象

1、非容器 + 不可变对象(NSString) + retain + copy + mutableCopy
  • retain和copy为浅复制
  • mutableCopy为深复制
2、非容器 + 可变对象(NSMutableString) + retain + copy + mutableCopy
  • retian对可变对象为浅复制
  • copy对可变对象非容器类为深复制
  • mutableCopy对可变非容器类为深复制
3、容器类 + 非可变对象 + retain + copy + mutableCopy
  • retain和copy为浅复制
  • mutableCopy为深复制
  • 这里对容器的深复制,实际上是不完全深复制,对于容器内的元素,依然是浅复制的形式,只复制了地址,没有复制内容。
4、容器类 + 可变对象 + retain + copy + mutableCopy
  • retain为浅复制
  • copy和mutableCopy为深复制
  • 这里对容器的深复制,实际上是不完全深复制,对于容器内的元素,依然是浅复制的形式,只复制了地址,没有复制内容。

进行容器类完全深复制的2种方法

1、用 initWithArray:copyItems: 将第二个参数设置为YES即可深复制

NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];

这样就可以把dataArray1的内容完全深复制到dataArray2中了。

2、使用基础框架的归档功能:

dataArray2 = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject: dataArray1]]

归档

既然接触到归档,就简单了解下归档吧。

归档是指,在字典,数组,自定义的对象等需要存储时,转换为字节流NSData类型数据,再通过写入文件来进行存储。

因此,归档常用于离线缓存,将有网时的数据存放在本地;也可以缓存用户搜索历史记录。

归档的代码:

NSKeyedArchiver *archvier = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

这里的data就是要转成字节流的对象。

相对应的解档:

[NSKeyedUnarchiver unarchiveObjectWithData:archvier];

感觉平时用不太到,也没深入了解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值