在Cocoa中,我们更喜欢NSInteger还是int,为什么?
NSInteger / NSUInteger是可可定义的常规内置类型的替代品。
使用NS *类型比内置函数有什么好处?你更喜欢哪个?为什么?在32位/ 64位平台上," NSInteger"和" int"的宽度是否相同?
解决方案
回答
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有更多信息。
回答
我理解的方式是NSInteger等。是相应C类型的体系结构安全版本。基本上,它们的大小取决于体系结构,但是例如,可以保证NSInteger保留当前体系结构的任何有效指针。
Apple建议我们将它们与OS X 10.5及更高版本一起使用,Apple的API:s将使用它们,因此,养成使用它们的习惯绝对是一个好主意。它们需要更多输入,但除此之外,似乎没有任何理由不使用它们。
回答
我更喜欢标准的c样式声明,但这仅是因为我在几种语言之间进行切换,而我不必对此进行过多思考,但听起来我应该开始关注nsinteger了。
回答
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位整数来计数秒数...