将 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 类)的主要内容,如果未能解决你的问题,请参考以下文章

objc对象调用方法详细过程

OC 类的结构分析

Objective-C

IOS开发-ObjC-Category的使用

具有类私有成员和函数指针的继承结构

objc非主流代码技巧