在Cocoa你喜欢NSInteger还是int,为什么?

时间:2008-08-17 17:01:45

标签: objective-c cocoa types

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

在内置插件上使用NS *类型有什么好处吗?你更喜欢哪个?为什么?在{32} / 64位平台上,NSIntegerint的宽度是否相同?

5 个答案:

答案 0 :(得分:56)

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

Apple建议您使用它们与OS X 10.5及更高版本一起使用,而Apple的API将使用它们,因此养成使用它们的习惯绝对是个好主意。它们需要更多的打字,但除此之外似乎没有任何理由不使用它们。

答案 1 :(得分: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位整数来计算几秒钟是不可能的......

答案 2 :(得分:18)

64位实际上是NSInteger和NSUInteger的存在理由;在10.5之前,那些不存在。这两个被简单地定义为64位的长整数,以及32位的整数:

#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 has some more info.

答案 3 :(得分:0)

我更喜欢标准的c样式声明,但只是因为我在几种语言之间切换而且我不必过多考虑它,但听起来我应该开始看nsinteger

答案 4 :(得分:0)

要将数据导入和导出到文件或通过网络,我使用 UInt32 SInt64 等...

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