在Objective C中使用C结构的优点是什么?
我目前正在学习Objective C,并且遇到了C结构的使用。但是,我一直想知道以下问题的答案:在Objective C中使用C结构的优点是什么?
如果我们可以创建Objective C类,那么使用C结构的优点或要点是什么?
例如,以下C结构:
struct date {
int day;
int month;
int year;
};
这位一个NSDate
类。那么上面那个C结构有什么意义呢?
您可以将C结构传递给您直接链接到程序中的C或C++库,例如Unix系统调用。
UIKit和Foundation使用许多C结构,如CGRect和NSRange。
NSNumbers的NSArray比简单的C数组要昂贵得多。您不希望将绘图上下文表示为表示像素的NSNumber行的NSArrays的NSArray。你想要一个简单的原始位描述。
用C结构的目标C项目的原因是:
与另一语言的交互,例如在使用C,C++一个游戏项目等
要与之通信的一些Apple框架:石英核心等
...
问问自己使用什么,比如说double
? A double
是一种抽象数据类型(它有多个内部存储在一个你不需要知道的格式)并且是按值传递的。你可以使用基于对象的浮点数(例如NSNumber
),但对于标准数学,你为什么要这样做?
小数或复数如何?这可能是由两个浮点数表示的。它应该像double
- 堆栈分配一样,按值传递 - 或像对象 - 堆分配,按引用传递?会像double
那样表现得最有意义,它们毕竟只是数字......
现在考虑一个点,也可能是由两个浮点数 - 值类型或对象类型行为表示的?苹果去价值型为NSPoint
,看看它的定义,你会看到它的struct
。你认为这是否正确?
如果NSDate
刚刚存储一年/月/日,那么苹果可能会选择一个struct
,但其日历和时区支持比它多一点。但NSTimeInterval
是一个值类型(甚至不是struct
,只是double
的别名)。
你在哪里绘制应该是一个值类型和应该是一个对象类型之间的边界有些主观。但是一般来说,如果类型是“数字类型”,那么使用值类型可能是一个好的或者更好的选择。
“NSNumbers的NSArray比简单的C数组要昂贵得多。” - 它*可能会更贵。这很大程度上取决于你想要做什么。 http://stackoverflow.com/a/6268062/97337但是,对于一些常见的使用情况,您是正确的,C数据类型的开销较少,因此对于某些性能关键型工作更受欢迎。 –
@RobNapier如果你在任何64位平台上,这些NSNumbers根本不需要分配,因此,NSNumbers将比分配和存储一个结构更快! – bbum