Collection官方文档

  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的可变性不变。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术与生活

设计模式-备忘录模式

备忘录角色对如何其他对象提供一个接口,也就是宽接口的话,那么备忘录角色存储的内部状态都暴露给其他对象。这种情况导致发起人的状态都没看到,是破坏封装性的,只能通过...

1012
来自专栏SeanCheney的专栏

《利用Python进行数据分析·第2版》第6章 数据加载、存储与文件格式6.1 读写文本格式的数据6.2 二进制数据格式6.3 Web APIs交互6.4 数据库交互6.5 总结

访问数据是使用本书所介绍的这些工具的第一步。我会着重介绍pandas的数据输入与输出,虽然别的库中也有不少以此为目的的工具。 输入输出通常可以划分为几个大类:读...

5546
来自专栏FreeBuf

浅析ReDoS的原理与实践

*本文原创作者:MyKings,本文属FreeBuf原创奖励计划,未经许可禁止转载 ReDoS(Regular expression Denial of Ser...

6455
来自专栏源码之家

word如何自动分割成多个文档

3875
来自专栏黄Java的地盘

[翻译]WebSocket协议第二章——Conformance Requirements

本文为WebSocket协议的第二章,本文翻译的主要内容为WebSocket协议中相关术语的介绍。

871
来自专栏达摩兵的技术空间

break与continue跳出的理解

如果你还缺乏对break与continue断点跳出循环的正确理解,请复制粘贴以下代码,思考得出答案(代码涉及标签语句的用法,如果不会的请自行百度)。

962
来自专栏小狼的世界

Javascript设计模式学习(一)封装和信息隐藏

在我们编程的过程中,我们应该尽可能的把数据和函数处理信息隐藏在对象内部,在Javascript中,我们怎样来做呢?

934
来自专栏大内老A

[ASP.NET MVC]通过对HtmlHelper扩展简化“列表控件”的绑定

在众多表单元素中,有一类<select>元素用于绑定一组预定义列表。传统的ASP.NET Web Form中,它对应着一组重要的控件类型,即ListContro...

1925
来自专栏令仔很忙

观察者模式和Spring的结合

这周给分了一个任务,就是对查询回来的数据进行各种各样的过滤,有七种不同的过滤条件。过滤条件是在数据库中存着的。在我们项目中有一个热发,就是定时的从数据库中把数...

1152
来自专栏听雨堂

用Layer.search快速查询图元

    Mapx中查找图元,用Layer.search来完成;     Layer.search支持用比较表达式来进行查询;但是,往往会报告变量不存在。原因在于...

20910

扫码关注云+社区

领取腾讯云代金券