使用NSInteger而不是int的好处?

Jor*_*n H 21 64-bit objective-c nsinteger 32bit-64bit ios

我试图理解在开发32位和64位架构时如何影响开发.根据我迄今为止所研究的内容,int无论运行应用程序的设备的架构如何,我都知道总是4个字节.但是NSInteger32位设备上是4个字节,64位设备上是8个字节.我得到的印象NSInteger是"更安全"并推荐,但我不确定是什么原因.

我的问题是,如果你知道你正在使用的可能值永远不会很大(也许你正在使用它来索引一个包含200个项目的数组或存储数组中对象的数量),为什么要将它定义为一个NSInteger?当你不使用它时,这只会占用8个字节.int在这些情况下将它定义为更好吗?如果是这样,在什么情况下,你会希望使用NSInteger(而不是intlong等)?显然,如果你需要使用更大的数字,你可以使用64位架构.但是如果你需要它也可以在32位设备上工作,你会不会使用long long它,因为它在32位设备上也是8字节?我不明白为什么会使用NSInteger,至少在创建在两种架构上运行的应用程序时.

此外,我无法想到一个接收或返回原始类型的方法 - int而是利用NSInteger,并且想知道它是否还有更多,而不仅仅是值的大小.例如,(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section.我想明白为什么会这样.假设有一个2,147,483,647行的表,当你再添加一个32位设备时会发生什么 - 它是否会回绕到-2,147,483,647?在64位设备上,它将是2,147,483,648.(为什么返回有符号值?我认为它应该是无符号的,因为你不能有负数行.)

最后,我想更好地理解这些数字数据类型的实际使用,也许一些代码示例会很棒!

Irf*_*fan 3

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

NSInteger/NSUInteger被定义为typedef这些类型之一的 *dynamic *s,它们的定义如下:

#if __LP64__ || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
Run Code Online (Sandbox Code Playgroud)

因此,当您需要“位本机”大小时,可以使用它们代替更基本的 C 类型。

我建议您仔细阅读此链接。 CocoaDev 有更多信息。

有关应为每种类型使用的正确格式说明符,请参阅字符串编程指南中有关平台依赖性的部分