当开发iOS时,我应该使用NSInteger vs. int ?我在苹果的示例代码中看到,他们在将值作为参数传递给函数或从函数返回值时使用NSInteger(或NSUInteger)。
- (NSInteger)someFunc;...
- (void)someFuncWithInt:(NSInteger)value;...
但在函数中,他们只是用int来跟踪一个值
for (int i; i < something; i++)
...
int something;
something += somethingElseThatsAnInt;
...
我读过(被告知),NSInteger是一个安全的方法来引用一个整数在64位或32位的环境,所以为什么要使用int在所有?
截至目前(2014年9月),我建议在与iOS API交互时使用NSInteger/CGFloat等,如果你也在为arm64构建应用程序。
这是因为当您使用float、long和int类型时,可能会得到意想不到的结果。
例子:FLOAT/DOUBLE vs CGFLOAT
例如,我们使用UITableView委托方法tableView: highightforrowatindexpath:。
在仅32位的应用程序中,如果它是这样写的,它会工作得很好:
-(float)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
Float是一个32位的值,您返回的44也是一个32位的值。
然而,如果我们在64位arm64架构中编译/运行同一段代码,44将是一个64位值。当需要一个32位值时返回一个64位值将会给出一个意外的行高。
您可以通过使用CGFloat类型来解决这个问题
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 44;
}
该类型表示32位环境中的32位浮点数和64位环境中的64位双精度浮点数。因此,在使用此类型时,无论编译/运行时环境如何,方法总是会接收到预期的类型。
对于期望整数的方法也是如此。
这样的方法在32位环境中需要一个32位的int值,在64位环境中需要一个64位的long值。你可以根据编译/运行时环境使用NSInteger类型作为int或long类型来解决这种情况。
当你不知道你的代码会在什么样的处理器架构上运行时,你通常会使用NSInteger,所以你可能出于某种原因想要最大的整数类型,在32位系统中它只是一个int,而在64位系统中它是一个long。
我坚持使用NSInteger而不是int/long,除非你特别需要它们。
NSInteger/NSUInteger被定义为这些类型之一的动态类型定义,它们的定义如下:
#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
关于这些类型应该使用的正确格式说明符,请参阅字符串编程指南的平台依赖项部分