English 中文(简体)
在Cocoa中使用结构体列表是否有意义?
原标题:
  • 时间:2008-12-26 09:55:42
  •  标签:

这个问题起源于这个问题。 在Cocoa中处理结构体列表并不简单。要么使用NSArray并进行编码/解码,要么使用C类型数组并失去NSArray的便利性。 结构体应该是简单的,但是当需要列表时,人们倾向于构建一个类。

什么时候在Cocoa中使用结构体列表是有意义的?

我知道关于结构体与类的问题已经有很多,我也读过其他用户争论它们在每种语言中都是相同的答案,但至少因为KVC或绑定,Cocoa应该有其自己特定的答案(正如彼得在第一个问题中建议的那样)。

最佳回答

可可有一些常见的类型是结构体,而不是对象:NSPoint、NSRect、NSRange(及其CG对应项)。

当你有疑问时,跟随Cocoa的引导。如果你发现自己正在处理大量的小型数据对象,为了提高效率,你可能想要将它们转换为结构体。

使用NSArray / NSMutableArray作为顶级容器,并将结构体包装在NSValue中,这可能会使您的生活变得轻松许多。只有当您发现NSArray成为性能瓶颈或者数组本质上是只读的时候,才可以使用纯C类型数组。

问题回答

在某些情况下使用结构体非常方便和有用,尤其是当你需要回到C语言时,比如在使用现有库或进行系统级操作时。有时你只需要一个紧凑的数据结构而不需要类的开销。如果你需要许多这样的结构体实例,它会对性能和内存占用产生真正的影响。

另一种使用结构数组的方法是使用 NSPointerArray 类。这需要更多的思考来设立,但它在那之后就几乎与 NSArray 一样工作,并且您不必费心进行装箱/拆箱或包装到类中,因此访问数据更加方便,且不会占用类的额外内存。

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

一般来说,使用结构体意味着存在一个相对简单的数据类型,它没有与之关联的逻辑,也不应该有任何关联的逻辑。以NSPoint为例-它仅是一个(x,y)表示。因此,也会出现一些与其使用相关的问题。一般来说,对于这种类型的数据,这是可以接受的,因为我们通常观察的是点的变化,而不是点的y坐标的变化(从根本上说,(0,1)并不等于向下移动1个单位的(1,1))。如果这是一种不希望的行为,那么使用类可能是一个更好的主意。





相关问题
热门标签