首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Collection官方文档

Collection官方文档

作者头像
nimomeng
发布2018-09-13 14:24:46
2K0
发布2018-09-13 14:24:46
举报
  1. NSDictionary 使用自定义key的几点注意:

a) Keys必须实现NSCopying协议。添加成员的方法并不将每一个key直接进行添加,而是将每一个key进行copy并将copy后对象添加到dictionary中。在添加到dictionary之后,自有的keys的copy对象不能被修改。 b) Keys还必须实现hash和isEqual方法,因为dictionary使用了hashTable来组织存储,并且进行快速访问。并且,dictionary的高性能严重依赖了hash方法。 c) 虽然可以用任何使用了NSCopying协议并继承了hash、isEqual方法的对象,但是最好不要使用large Object来做key,比如NSImage等等,因为这样会损耗性能。

  1. Set中的object必须能响应NSObject的hash方法与isEqual方法。如果可变对象被存储在set中,hash方法不应该依赖于可变对象的内部状态,而且可变对象在set中不应该被修改。
  2. Set中的objects不是copy类型的(除非你传了YES到initWithSet:copyItems:). 强引用的对象被添加到了set中。
  3. 有两种copy类型:浅copy和深copy。普通copy是浅copy,它会创建一个新的collection并且和原始值共享一个对象(也就是共同指向同一个对象)。深copy是创建一个新的对象并且添加到新collection中。

a) 浅copy。当你创建浅copy,对象接收到retain信息,指针被copy到新的collection。 b) 深copy。有两种方法可以深copy: i. 通过initWithArray:copyItems:传YES参数作为第二参数。如果用这种方式进行深copy,每一个object都会发送copyWithZone:方法。 如果objects实现了NSCopying协议,则会进行深copy对象;如果没有实现NSCopying协议,会报错。CopyWithZone只会执行一层copy。 ii. 如果需要一个真正的深copy,比如有一个二维数组,可以archive之后进行unarchive那个collection,保证所有内容实现了NSCoding协议。例如:NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray];]

  1. 几种Copy方法的甄别:

a) CopyWithZone:使得表层immutable的方法。深层level维持原状。 b) InitWithArray:copyItems: 如果传NO,获得表面level的可变性。内部的可变性保持不变。 c) InitWithArray:copyItems: 如果传YES,获得表面level的可变性。下一level是不可变的,再深层的可变性维持不变。 d) Archiving和Unarchiving保持所有level的可变性不变。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.06.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档