将C Struct重写为ObjC类(C Struct vs ObjC类)

时间:2013-11-12 16:28:31

标签: objective-c class struct

我读过这篇文章:http://www.koboldtouch.com/display/IDCAR/Use+Classes+Instead+of+Structs

而且我一直在想我会在我的ObjC应用程序中使用类而不是结构,但文章说它需要更多的内存。

我也读过这个问题的答案: Class vs Struct for data only? 并且它表示类中的变量默认为private,但它适用于C ++,它们是否默认为ObjC中的私有?我想不是因为如果我在ObjC中有@property,那么我可以从另一个对象访问它。

最后,如果我要创建一个只实现C结构的对象,那么使用@public {}和@property会有什么不同?

修改

对于未来的读者,需要阅读三个答案,所有人都回答问题,但我必须选择并回答所以这就是我选择答案的原因。

3 个答案:

答案 0 :(得分:3)

我不担心Objective-C类与struct相比的额外内存要求,除非您在内存中存储了大量对象。那么它可能值得考虑。使用Objective-C类可以获得其他好处。

WRT to public vs properties;你不希望对象之外的代码“通常”搞乱你的实例变量。在某些情况下,它无关紧要,您可以使用@property / @synthesize而无需担心,但有时您可能想要验证分配的值或在分配特定值时执行某些操作。使用开头的属性允许您稍后更改此属性,而不会影响使用您的类的任何代码。

答案 1 :(得分:2)

首先采用简单的方法,然后如果你揭示实际运行代码的分析内存占用太大,那么重新考虑......

基本上Obj-C类是一个结构。它是一个结构体,它有一个指向类对象的指针,以及超类和该类声明的所有ivars。

通过使用易于内存管理的类和对象以及收集类,您将获得如此多的收益,这是非常愚蠢的(除非在非常特殊的情况下)

对于第二个问题......您通常希望使用超过obj->iVar

的属性

这保持了封装,并且还允许在setter上进行验证......并且还会触发KVO通知。

基本上是这样的:

使用对象/类,除非你有理由不这样做 使用属性,除非您有理由不这样做。

答案 2 :(得分:2)

  

并且它表示类中的变量默认为private但它   对于C ++,他们在ObjC中默认为私有吗?

Objective-C中@interface中声明的实例变量默认为@protected。在Objective-C中@implementation中声明的实例变量默认为@private。您可以像在C ++中一样手动使用@public@protected@private

  

我想不是因为如果我在ObjC中有@property,那么我可以访问它   从另一个对象。

属性访问正在调用方法。它与实例变量访问完全不同。