有没有理由使用NSInteger而不是uint8_t和NS_ENUM?

时间:2016-05-06 15:43:08

标签: objective-c cocoa

通用标准似乎使用NS_ENUM作为基本类型NSInteger。为什么会这样?假设少于256个案例(几乎涵盖任何枚举),是否有任何理由使用它而不是uint8_t,这可能会占用更少的内存空间?要么进入Swift罚款。

这与NS_OPTIONS不同,其中较大的类型是有意义的,因为您不应该使用枚举进行任何数学运算,并且您可以使用基类型可表示的每个数字作为值。

3 个答案:

答案 0 :(得分:2)

标题中问题的答案:

  

有没有理由使用NSInteger而不是uint8_t和NS_ENUM?

可能不是。

如果没有指定基础类型,在C中声明枚举时,编译器可以从char中自由选择任何合适的类型,并且至少的有符号和无符号整数类型代表所有类型所需的价值。当前的Xcode / Clang编译器选择一个4字节的整数。可以合理地假设编译器编写者做出了明智的选择 - 性能和存储之间的某种平衡。

较小的类型,例如uint8_t,通常会在内存中(或在光盘上)的较小边界上对齐 - 但是,如果相邻字段与对齐匹配,则这只会有益。如果一个2字节大小的类型字段跟随一个1字节大小的类型字段,那么除非另有说明(例如,使用#pragma packed),否则可能存在插入的未使用字节。

任何性能或存储差异是否显着都将严重依赖于应用程序。遵循通常的经验法则 - 不要优化,直到找到问题为止。

但是,如果您发现语义在限制大小方面的好处,那么肯定会这样做 - 没有一般原因你不应该这样做。选择类似于选择有符号和无符号整数,一些程序员避免使用无符号类型的值为≥0,除非额外范围绝对需要,而其他程序员则理解语义上的好处。

总结:没有正确答案,主要是主观问题。

HTH

答案 1 :(得分:1)

首先:内存占用接近完全没有意义。你说的是1 Byte vs. 4/8 Bytes。 (如果内存对齐不强制使用4/8字节,无论你选择了什么。)你想在正在运行的应用程序中拥有多少个NS_ENUM(C)对象?

我想原因很简单:NSInteger类似于Cocoa中的“catch all”整数类型。这使得赋值更容易,尤其是您不必关心将较大的整数类型分配给较小的整数类型。没有铸造,这将导致警告。

在具有32/64位模型的桌面应用程序中具有多个整数类型类似于过时。也不是Mac也不是MacBook,iPhone也不是嵌入式微控制器......

答案 2 :(得分:0)

您可以使用任何整数数据类型,包括uint8_t和NS_ENUM作为。

typedef NS_ENUM(uint8_t, eEnumAddEditViewMode) {
  eWBEnumAddMode,
  eWBEnumEditMode

};

在旧的c风格标准中,NSInteger是默认的,因为NSInteger类似于目标c中的“catch all”整数类型。开发人员可以轻松地使用自己的变量键入装箱和拆箱。这只是开发人员友好的最佳实践。