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等等,因为这样会损耗性能。
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];]
a) CopyWithZone:使得表层immutable的方法。深层level维持原状。 b) InitWithArray:copyItems: 如果传NO,获得表面level的可变性。内部的可变性保持不变。 c) InitWithArray:copyItems: 如果传YES,获得表面level的可变性。下一level是不可变的,再深层的可变性维持不变。 d) Archiving和Unarchiving保持所有level的可变性不变。