在Cocoa中,我们更喜欢NSInteger还是int,为什么?

时间:2020-03-05 18:40:10  来源:igfitidea点击:

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