在什么情况下我需要使用NSInteger,而何时使用简单的int?

13 浏览
0 Comments

在什么情况下我需要使用NSInteger,而何时使用简单的int?

在开发iOS应用程序时,我应该在什么时候使用NSInteger而不是int?我在苹果的示例代码中看到他们在将值作为参数传递给函数或从函数返回值时使用NSInteger(或NSUInteger)。\n

- (NSInteger)someFunc;...
- (void)someFuncWithInt:(NSInteger)value;...

\n但在函数内部,他们只是使用int来跟踪一个值\n

for (int i; i < something; i++)
...
int something;
something += somethingElseThatsAnInt;
...

\n我读过(被告知)NSInteger在64位或32位环境中引用整数是一种安全的方法,那为什么还要使用int呢?

0
0 Comments

在OS X中,"LP64"表示以下几点:

- int类型始终为32位

- long long类型始终为64位

- NSInteger和long类型始终为指针大小。这意味着在32位系统上为32位,在64位系统上为64位。

存在NSInteger的原因是因为许多传统的API错误地使用int代替long来保存指针大小的变量,这意味着API在64位版本中必须从int更改为long。换句话说,根据编译的是32位还是64位架构,API的函数签名会有所不同。NSInteger旨在掩盖这些传统API的问题。

在新代码中,如果需要32位变量,请使用int;如果需要64位整数,请使用long long;如果需要指针大小的变量,请使用long或NSInteger。

然而,这些建议是不合理的。如果需要32位变量,请使用int32_t;如果需要64位整数,请使用int64_t;如果需要指针大小的变量,请使用intptr_t。

我的建议是,如果需要已知固定大小的整数类型,则不要使用int、long或NSInteger。而是使用中的类型。

我的回答是针对问题“何时使用NSInteger而不是int”的,而不是“32位整数的跨平台类型名称是什么”。如果有人在NSInteger和int之间做选择,他们可能需要知道它们在所支持的平台上的大小。

另请注意,LP64并不保证long long为64位。LP64平台可以选择将long long设置为128位整数。

这个答案是否适用于Lion操作系统,无法确定。

0
0 Comments

对于循环控制变量,使用int数据类型是没有问题的,因为int数据类型的大小和它可以保存的值对于循环来说是足够的,不需要依赖于特定的平台。即使是16位的int,在大多数情况下也可以使用。

在函数的返回值或者函数的参数中,Apple使用NSInteger数据类型,因为在这种情况下数据类型的大小是重要的,因为你要做的是与其他程序或者代码片段进行数据的通信/传递;参见问题中的"When should I be using NSInteger vs int?"的答案。

所以,Apple在将一个值作为函数的参数传递或者从函数中返回时,使用NSInteger(或NSUInteger)。

0
0 Comments

在使用NSInteger和普通int之间需要选择时,可以考虑以下因素:

1. 处理器架构:当不确定代码可能运行在哪种处理器架构上时,最好使用NSInteger。在32位系统上,NSInteger是int类型,在64位系统上,NSInteger是long类型。使用NSInteger可以确保选择最大的整数类型。

2. 格式说明符:使用NSInteger时,需要注意使用正确的格式说明符。可以参考苹果的字符串编程指南中关于平台依赖的部分,以确定正确的格式说明符。

3. API要求:如果与使用int的API进行交互,则应使用int而不是NSInteger。在Cocoa之外的很少使用NSInteger,因此与其他库进行交互时,可能需要使用int类型。

4. 内存效率:使用int可能更适合某些情况,比如已知数值不会超过某个范围。在这种情况下,使用int可能更节省内存。

需要注意的是,在使用NSInteger时,需要考虑不同处理器架构之间的兼容性。如果在64位系统上使用NSInteger存储一个long类型的值,但其他用户在32位系统上运行代码,可能会导致错误而不易察觉。

选择使用NSInteger还是普通int取决于具体情况和需求。如果不确定处理器架构或需要与使用int的API进行交互,则建议使用NSInteger。如果已知数值范围或需要更节省内存,则可以选择使用int。

0