在cocoa你喜欢NSInteger或int,为什么?
NSInteger
/ NSUInteger
是Cocoa定义的常规内置types的替代品。
使用内置的NS *types有什么好处? 你更偏向于哪个,为什么? NSInteger
和int
在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_32
variablesreplaceNSInteger
variables, 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使用UInt32 , SInt64等…
无论体系结构如何,这些都保证具有一定的规模,并且有助于将代码移植到其他平台和共享这些types的语言。