结构体或类

6
我正在开发一个iPhone 3.1.3应用程序。
我有一个名为“Object2D”的类,其中包含字段和方法,代表一种形状。 “Object2D”有一个表示其大小的字段,以及另一个表示其类型的字段。
现在,我需要另一个名为“Pattern”的类,它是一组形状。 在“Pattern”中,我将拥有一个形状数组。 我只需要这些形状的大小、类型以及它们在模式内的位置,不需要任何方法。
我想知道,是创建一个新的结构体来代替“Object2D”类更好,还是继续使用“Object2D”类。
我之所以问这个问题,是因为我考虑到了内存性能。 我不确定,但是结构体比类更小,也许最好使用它们而不是类。
你觉得呢?
2个回答

20

如果你考虑内存使用,几乎在每种情况下对象和结构体之间的区别微不足道。对象比等价结构体多一个指针。

更大的差异在于如何使用它们。对象可以具有方法和层次结构,并与 Cocoa 的其他部分交互。在结构体中,您需要为每个结构体类型制作自定义函数或者拼凑伪对象系统。除此之外,任意结构体与 Cocoa(Touch)的其他部分相互作用不好。例如:

  • 如果你在其中存储对象,你必须非常小心地正确进行自己的内存管理
  • 您无法将它们存储在 NSArrays 中而不创建对象包装器(因为 NSArray 是对象数组)
  • 您不能在 Interface Builder 中连接结构体 - 它不知道它们的存在
  • 您不能使用结构体进行 KVO 或 KVC

通常来说,如果您正在使用类似 Cocoa 的框架,请选择对象作为默认选项。在决定确实需要它们之后,使用结构体。


一个非常晚的跟进问题:额外的成本难道不应该比单个指针更高吗?运行时关于类的信息,这些信息在结构体中不存在,包括它的isa、保留计数和分派表(尽管我猜通常对所有实例来说都是共同的,除非你正在进行方法交换或添加方法)。所以,这肯定至少需要两个指针和一个整数吧? - Tommy

5

实际上,Objective-C类是结构体。只要实例变量的布局顺序与结构成员相同,它们的大小唯一的区别就是NSObjectisa变量的4或8个字节。

注意:上面的答案假定使用传统的Objective-C运行时,没有使用@property@synthesize指令,这可能会影响它们的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接