48

NSInteger/NSUInteger是 Cocoa 定义的常规内置类型的替代品。

使用 NS* 类型而不是内置函数有什么好处吗?你更喜欢哪个?为什么?32 位/64 位平台上的宽度NSInteger是否相同?int

4

5 回答 5

58

我理解它的方式是 NSInteger 等人。是相应 C 类型的体系结构安全版本。基本上,它们的大小因架构而异,但例如,NSInteger 可以保证为当前架构保存任何有效指针。

Apple 建议您将这些用于 OS X 10.5 及更高版本,Apple 的 API:s 将使用它们,因此养成使用它们的习惯绝对是个好主意。它们需要更多的输入,但除此之外,似乎没有任何理由不使用它们。

于 2008-08-17T17:20:31.803 回答
43

64 位运行时的量化问题

在某些情况下,可能有充分的理由使用标准类型而不是NSInteger:64 位系统中的“意外”内存膨胀。

显然,如果整数是 8 而不是 4 字节,则值占用的内存量会加倍。但是,鉴于并非每个值都是整数,您通常不应期望应用程序的内存占用量翻倍。但是,Mac OS X 分配内存的方式会根据请求的内存量而变化。

目前,如果您要求 512 字节或更少,malloc则向上舍入到 16 字节的下一个倍数。但是,如果您要求超过 512 个字节,则malloc向上舍入到 512 的下一个倍数(至少 1024 个字节)。假设您定义了一个类——其中包括——声明了五个NSInteger实例变量,并且在 32 位系统上,每个实例占用例如 272 个字节。在 64 位系统上,实例理论上需要 544 个字节。但是,由于内存分配策略,每个实际上将占用 1024 字节(几乎增加了四倍)。如果您使用大量这些对象,您的应用程序的内存占用量可能会比您预期的要大得多。如果您用NSInteger变量替换sint_32变量,您将只使用 512 个字节。

因此,当您选择要使用的标量时,请确保选择合理的值。是否有任何理由需要一个大于 32 位应用程序所需的值?不太可能需要使用 64 位整数来计算秒数……

于 2008-10-13T23:48:46.133 回答
18

64 位实际上是 NSInteger 和 NSUInteger 存在的理由;在 10.5 之前,那些不存在。两者在 64 位中被简单地定义为 long,在 32 位中被定义为 int:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

因此,当您想要“位原生”大小时,可以使用它们代替更基本的 C 类型。

CocoaDev 有更多信息。

于 2008-08-17T17:09:21.343 回答
0

我更喜欢标准的 c 风格声明,但这只是因为我在几种语言之间切换,我不必考虑太多,但听起来我应该开始看 nsinteger

于 2008-08-17T17:58:56.970 回答
0

为了将数据导入和导出到文件或通过网络,我使用UInt32SInt64等...

无论架构如何,它们都保证具有一定的大小,并有助于将代码移植到也共享这些类型的其他平台和语言。

于 2012-04-19T03:36:19.607 回答