8

最近一直在思考的一个问题。我主要是一名 .net 开发人员,涉足 iPhone 和 Mac 的 Objective-C。

你如何在objective-c中的方法之间发送“数据集”。例如,在 C# 中,您可以使用数据填充自定义类并将其传递给自定义类类型的列表。例如,如果您有一个客户类,您只需执行以下操作:

List<Customer> customers = DataLayer.GetAllCustomers();

我可以看到如何在 obj-c 中完成此操作的唯一方法是使用自定义对象填充 NSArray?这是一种有效的做事方式吗?还有其他建议吗?我使用 sqlite 作为我要返回的数据库/数据。

4

1 回答 1

25

你在正确的轨道上。

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 的自动生成、对从一个模式版本迁移到另一个模式版本的细粒度控制等功能。

于 2008-08-27T21:03:04.880 回答