你在正确的轨道上。
Cocoa 的集合类——它们都有可变的和不可变的变体——是:
- NSArray:有序,可以多次包含一个对象
- NSDictionary:无序,从键到值的映射,键被复制
- NSSet:无序,一个对象只能包含一次
- NSCountedSet:无序,可以多次包含一个对象
不可变的变体对效率有很大帮助。具有可变变体的类的访问器的标准模式是复制而不是保留。这@property
通过使用copy
属性上的属性在机制中进行了编码:
// Department.h
@interface Department : NSObject
@property (readwrite, copy) NSSet *employees;
@end
这意味着如果你将一个可变数组传递给一个接受数组的东西,它将被复制,如果你将它传递给其他东西,它将再次被复制。诀窍是虽然“复制”一个不可变对象实际上只是保留了它,所以你只会为第一个副本受到打击。无论如何,您可能希望第一次制作副本,这样您就不会将可变数组传递给其他东西,然后在您传递给它的任何内容的背后对其进行变异。
对于 Mac OS X 上的 Cocoa,我还强烈建议您查看 Core Data。它是您可能习惯于 .NET/ADO/etc 的“数据集”模式的替代方案。使用 Core Data,您不会“获得所有客户”然后传递该集合。相反,您查询您关心的客户,并且当您遍历您查询的对象的关系时,其他对象将自动为您提取。
Core Data 还为您提供诸如实体的可视化建模、属性 getter 和 setter 的自动生成、对从一个模式版本迁移到另一个模式版本的细粒度控制等功能。