将 C 结构重写为 ObjC 类(C 结构与 ObjC 类)
Posted
技术标签:
【中文标题】将 C 结构重写为 ObjC 类(C 结构与 ObjC 类)【英文标题】:Rewriting C Struct to ObjC Class (C Struct vs ObjC Class) 【发布时间】:2013-11-12 16:28:30 【问题描述】:我看了这篇文章:http://www.koboldtouch.com/display/IDCAR/Use+Classes+Instead+of+Structs
我已经在考虑我想在我的 ObjC 应用程序中使用类而不是结构,但文章说它需要更多的内存。
我还阅读了这个问题的选定答案: Class vs Struct for data only? 它说类中的变量默认为私有,但对于 C++,它们在 ObjC 中默认为私有吗?我认为不是因为如果我在 ObjC 中有一个 @property,那么我可以从另一个对象访问它。
最后,如果我只是要创建一个只实现 C 结构的对象,那么使用 @public 和 @property 有什么区别?
编辑
对于未来的读者,这三个答案都需要阅读,他们都回答了这个问题,但我必须选择并回答,所以这就是我选择一个的原因。
【问题讨论】:
Objective-C 对象需要一个类指针,类似于虚拟 C++ 类。我怀疑它可能到处都有更多字节的“gas”,尽管我从未见过对象结构的描述。 【参考方案1】:与struct
相比,我不会担心 Objective-C 类的额外内存需求,除非您在内存中存储大量对象。那么它可能值得考虑。使用 Objective-C 类可以获得其他好处。
WRT 到公共 vs 属性;您不希望对象之外的代码“通常”弄乱您的实例变量。在某些情况下,这并不重要,您可以使用@property
/@synthesize
而不必担心,但是有时您可能想要验证分配的值或在分配特定值时执行某些操作。从一开始就使用属性允许您稍后更改它,而不会影响任何使用您的类的代码。
【讨论】:
【参考方案2】:先做简单的方法,然后如果你发现分析实际运行的代码内存占用太大,那么重新考虑......
基本上,Obj-C 类是一个结构。它是一个结构体,有一个指向类对象的指针,以及超类声明的所有 ivars,以及那个类。
通过使用类和对象来简化内存管理,您获得了很多好处,如果不使用集合类,您将是愚蠢的(除非在非常特殊的情况下)
对于第二个问题...您通常总是希望使用 obj->iVar
以上的属性
这样可以保持封装,还允许在 setter 上进行验证...并且还会触发 KVO 通知。
所以基本上:
除非有理由不使用,否则请使用对象/类。 使用属性,除非你有理由不这样做。
【讨论】:
【参考方案3】:它说类中的变量默认为私有,但它 对于 C++,它们在 ObjC 中是否默认为私有?
Objective-C 中@interface
中声明的实例变量默认为@protected
。在 Objective-C 中以 @implementation
声明的实例变量默认为 @private
。您可以像在 C++ 中一样手动使用@public
、@protected
、@private
。
我认为不是因为如果我在 ObjC 中有 @property,那么我可以访问它 来自另一个对象。
属性访问正在调用方法。它与实例变量访问完全不同。
【讨论】:
以上是关于将 C 结构重写为 ObjC 类(C 结构与 ObjC 类)的主要内容,如果未能解决你的问题,请参考以下文章