关于C#:在可可中,您更喜欢NSInteger还是int,为什么?

关于C#:在可可中,您更喜欢NSInteger还是int,为什么?

In Cocoa do you prefer NSInteger or int, and why?

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

使用NS *类型比内置函数有什么好处? 你更偏向于哪个,为什么? 在32位/ 64位平台上,NSIntegerint的宽度是否相同?


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

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


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位整数来计数秒数...


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

1
2
3
4
5
6
7
#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有更多信息。


为了将数据导入或导出到文件或通过网络,我使用UInt32,SInt64等。

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


我更喜欢标准的c样式声明,但仅是因为我在几种语言之间切换并且我不必对此进行过多思考,但听起来我应该开始关注nsinteger


推荐阅读