在Objective-C中使用Structs(适用于iOS):过早优化?

Dan*_*ark 11 iphone objective-c

我意识到过早优化具有主观成分,但这是一个经验或最佳实践问题.

在为iOS编程时,我是否更喜欢使用struct和typedef,其中对象没有"行为"(方法,基本上)?我的感觉是struct对于非C人来说语法有点奇怪,但它应该是低调的.然后,用50K NSObject实例测试一些案例,它似乎并不坏(相对,我知道).NSObject除非我遇到性能问题,否则我应该"习惯它"(尽可能使用结构)或实例正常吗?

典型的情况是具有两个int成员变量的类.我已经读过使用结构来保存两个NSString实例(或任何子NSObject类)是一个坏主意.

Yuj*_*uji 14

Struct带有NSObject实例的s 绝对是个坏主意.您需要-init-dealloc正确处理保留计数.写作retainreleases来自呼叫者方面只是疯了.它永远不会得到回报.

Struct有两个int或四个doubles的是边缘情况.在Cocoa框架自身实现NSRect,NSPoint等等.作为一个结构.但是这个事实让很多新人感到困惑.老实说,即使原始类型和对象类型之间的区别也会使它们混淆.当你将structs作为对象的属性时,它甚至会让我感到困惑:你做不到

object.frame.origin.x=10;
Run Code Online (Sandbox Code Playgroud)

如果你开始制作自己struct的,你需要记住哪个是哪个.这又是一个麻烦.我认为他们(NSRect等)的原因struct基本上都是历史性的.

我宁愿做一切对象.如果可用的话,使用垃圾收集.

并且,不要问人们是否值得优化.用仪器或其他方法自己测量.根据环境(ppc vs intel,OS X vs iOS,iPad vs iPhone),在新系统中,在先前系统中速度更快的一种方式可能会更慢.


Tom*_*sen 11

Objective C对象具有与结构几乎相同的存储空间,除了它是4个字节(64位上的8个字节)更大.就是这样 - 只有一个指向运行时保存所有类信息的地方的指针.

如果你的内存紧张,那么就会失去4个字节,但通常只有大量的对象:50,000 Nsobjects vs structs只有200k - 你可以获得200k的很多东西.对于一百万个对象,成本将增加到iPhone上.

如果你想说项目转移到openGL或需要交流数组用于其他目的,那么另一个选择是使ONE NSObject具有指向所有50,000个整数的malloc指针.然后目标c内存开销是〜0,你可以将所有讨厌的malloc和free()东西封装到一个.m文件的内部.


zou*_*oul 10

使用常规对象,直到遇到可测量的性能瓶颈.即使在严格的游戏循环中我也使用了高级代码而没有问题 - 消息传递,集合类,自动释放池,没有问题.


Jer*_*myP 5

我认为使用结构来保存少量原始(即非对象)类型而没有任何行为需要时,我没有任何问题.在Cocoa框架中已经有几个这样的例子(例如CGRect,CGSize,CGPoint,NSRange).

不要使用结构来保存Objective-C对象.它使参考计数环境中的内存管理变得复杂,并且可能在GC环境中完全破坏它.