在cocoa你喜欢NSInteger或int,为什么?

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

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

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

苹果build议您使用这些来与OS X 10.5及以上版本兼容,而苹果的API将会使用它们,因此养成使用它们的习惯绝对是一个好主意。 他们需要多一点打字,但除此之外似乎没有任何理由不使用它们。

64位运行时的量化问题

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

很显然,如果一个整数是8而不是4个字节,那么由内存占用的内存数量会增加一倍。 但是,由于并不是每个值都是整数,所以通常不会期望应用程序的内存占用量翻倍。 但是,Mac OS X分配内存的方式取决于请求的内存量。

目前,如果您要求512字节或更less, malloc下一个16字节的倍数。 但是,如果要求超过512个字节,则malloc循环到512的下一个倍数(至less1024个字节)。 假设你定义了一个类,其中声明了5个NSInteger实例variables,而在32位系统上,每个实例占用272个字节。 在64位系统上,实例理论上需要544个字节。 但是,由于内存分配策略,每个实际上将占用1024个字节(几乎增加四倍)。 如果您使用大量的这些对象,应用程序的内存占用空间可能会大大超出您的预期。 如果用sint_32variablesreplaceNSIntegervariables, sint_32只能使用512个字节。

因此,当你select使用什么标量时,要确保你select了合理的东西。 你有什么理由需要在你的32位应用程序中比你需要的值更大吗? 使用64位整数来计算秒数不太可能是必要的。

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 

因此,当你想要'比特原生'的大小时,使用它们代替更基本的Ctypes。

CocoaDev有一些更多的信息。

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

为了导入和导出数据到文件或通过networking使用UInt32SInt64等…

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