通用标准似乎使用NS_ENUM和NSInteger作为基本类型。为什么是这种情况?假设少于256个情况(几乎涵盖任何枚举),那么是否有理由使用它而不是uint8_t,因为它可以占用更少的内存空间?要么进口斯威夫特罚款。
这与NS_OPTIONS不同,后者更大的类型是有意义的,因为您不应该对枚举进行任何算术运算,并且可以使用基类型表示的每个数字作为值。
发布于 2016-05-08 07:25:16
标题中问题的答案是:
是否有理由在NSInteger中使用uint8_t而不是使用NS_ENUM?
很可能不是。
在C中声明枚举时,如果没有指定基础类型,编译器可以从char和有符号和无符号整数类型中选择任何合适的类型,这些类型至少可以表示所有所需的值。当前的Xcode/Clang编译器选择一个4字节的整数。人们可以合理地假设编译器编写者做出了明智的选择--某种性能和存储的平衡。
较小的类型(如uint8_t )通常将在内存(或磁盘)中较小的边界上对齐,但这只有在相邻字段与对齐匹配时才有好处,例如,如果2字节大小的类型化字段跟随1字节大小的类型字段,那么除非另有指定(例如使用#pragma packed),否则可能会有一个中间未使用的字节。
性能或存储差异是否显著将在很大程度上取决于应用程序。遵循通常的经验法则--在发现问题之前不要进行优化。
然而,如果您发现限制大小在语义上的好处,那么当然是这样做的--没有什么通用的理由不应该这样做。这种选择类似于选择有符号整数和无符号整数,一些程序员避免使用≥0的无符号类型,除非额外的范围是绝对必要的,而另一些程序员则欣赏语义上的好处。
摘要:没有正确的答案,这主要是一个主观的问题。
HTH
发布于 2016-05-06 15:53:30
首先,内存占用几乎完全没有意义。你说的是1字节对4/8字节。(如果内存对齐没有强制使用4/8字节,则不管您选择什么。)您希望在运行的应用程序中有多少NS_ENUM (C)对象?
我想原因很简单:NSInteger类似于Cocoa中的"catch all“整数类型。这使得分配更容易,特别是您不必关心将更大的整数类型分配给较小的整数类型。如果不进行强制转换,这将导致警告。
在一个32/64位模型的桌面应用程序中,拥有一个以上的整数类型类似于一个时代错误。也不是Mac,也不是MacBook,iPhone也不是嵌入式微控制器…。
发布于 2016-05-08 10:09:30
您可以使用任何整数数据类型,包括uint8_t和NS_ENUM as。
typedef NS_ENUM(uint8_t, eEnumAddEditViewMode) {
eWBEnumAddMode,
eWBEnumEditMode};
在旧的c风格标准中,NSInteger是默认的,因为NSInteger类似于目标C中的"catch all“整数类型,开发人员可以轻松地使用自己的变量键入装箱和取消装箱。这只是开发者友好的最佳实践。
https://stackoverflow.com/questions/37076427
复制相似问题