通用标准似乎使用NS_ENUM
作为基本类型NSInteger
。为什么会这样?假设少于256个案例(几乎涵盖任何枚举),是否有任何理由使用它而不是uint8_t
,这可能会占用更少的内存空间?要么进入Swift罚款。
这与NS_OPTIONS
不同,其中较大的类型是有意义的,因为您不应该使用枚举进行任何数学运算,并且您可以使用基类型可表示的每个数字作为值。
答案 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”整数类型。开发人员可以轻松地使用自己的变量键入装箱和拆箱。这只是开发人员友好的最佳实践。