在可可中使用结构列表是否有意义?

时间:2008-12-26 09:55:43

标签: c objective-c cocoa

这个问题已经产生了one.使用可可结构列表并不简单。使用NSArray和编码/解码,或使用C类型数组并丢失NSArray的商品。结构应该很简单,但是当需要一个列表时,人们倾向于构建一个类。

什么时候使用结构列表在可可中有意义?

我知道关于结构与类的问题已经有很多了,我读过用户认为每种语言的答案都是一样的,但至少可可应该有自己的具体答案,如果只是因为KVC或绑定(正如彼得在第一个问题上所建议的那样)。

3 个答案:

答案 0 :(得分:11)

Cocoa有一些常见的类型是结构,而不是对象:NSPoint,NSRect,NSRange(以及它们的CG对应物)。

如果有疑问,请跟随Cocoa的领先。如果你发现自己正在处理大量小的,主要是数据对象,你可能想要改进它们的结构以提高效率。

使用NSArray / NSMutableArray作为顶级容器,并将结构包装在NSValue中可能会让您的生活更轻松。如果您发现NSArray是性能瓶颈,或者如果阵列基本上是只读的,我只会转到直接的C型数组。

答案 1 :(得分:2)

有时使用结构是方便和有用的,特别是当您必须下拉到C时,例如使用现有库或执行系统级别的东西时。有时您只需要一个紧凑的数据结构而不需要类的开销。如果您需要许多此类结构的实例,它可以对性能和内存占用产生实际影响。

执行结构数组的另一种方法是使用NSPointerArray类。设置它需要更多的思考,但它之后就像NSArray一样工作,你不需要打扰装箱/拆箱或包装在类中,这样访问数据更方便,而且它不会占用一堂课的额外记忆。

NSPointerFunctions *pf = [[NSPointerFunctions alloc] initWithOptions:NSPointerFunctionsMallocMemory |
                          NSPointerFunctionsStructPersonality |
                          NSPointerFunctionsCopyIn];
pf.sizeFunction = keventSizeFunction;
self.pending = [[NSPointerArray alloc] initWithPointerFunctions:pf];

答案 2 :(得分:1)

通常,结构的使用意味着存在相对简单的数据类型,该数据类型没有与之关联的逻辑,也不应该具有与之关联的任何逻辑。以NSPoint为例 - 它只是一个(x,y)表示。鉴于此,它的使用也会产生一些问题。一般来说,对于这种类型的数据来说这是可以的,因为我们通常观察点的变化而不是点的y坐标(从根本上说,(0,1)与(1,1)移位不同减去1个单位)。如果这是一种不良行为,最好使用一个类。