Objective-C 隐式转换将失去整数精度“ NSUInteger”(也称为“ unsignedlong”)到“ int”警告

我正在做一些练习,得到了一个警告:

隐式转换会丢失整数精度: ‘ NSUInteger’(也称为‘ unsignedlong’)到‘ int’

#import <Foundation/Foundation.h>


int main (int argc, const char * argv[])
{
@autoreleasepool {


NSArray *myColors;


int i;
int count;


myColors = @[@"Red", @"Green", @"Blue", @"Yellow"];


count = myColors.count; //  <<< issue warning here


for (i = 0; i < count; i++)


NSLog (@"Element %i = %@", i, [myColors objectAtIndex: i]);
}


return 0;
}

Screenshot

167090 次浏览

NSArraycount方法在64位 OS X 平台上返回 NSUInteger

  • NSUInteger定义为 unsigned long,并且
  • unsigned long是一个64位无符号整数。
  • int是一个32位整数。

因此,int是一个比 NSUInteger“小”的数据类型,因此编译器会发出警告。

参见“基础数据类型参考”中的 NSUInteger:

在构建32位应用程序时,NSUInteger 是一个32位无符号的 位应用程序将 NSUInteger 视为64位无符号 整数

若要修复编译器警告,可以将本地 count变量声明为

NSUInteger count;
< p > 或(如果您确信数组中的元素不会超过 2^31-1!) , 添加一个明确的强制类型转换:

int count = (int)[myColors count];

与 Martin 的回答相反,转换为 int (或忽略警告)并不总是安全的,即使您知道您的数组不超过2 ^ 31-1个元素。在编译64位时不会。

例如:

NSArray *array = @[@"a", @"b", @"c"];


int i = (int) [array indexOfObject:@"d"];
// indexOfObject returned NSNotFound, which is NSIntegerMax, which is LONG_MAX in 64 bit.
// We cast this to int and got -1.
// But -1 != NSNotFound. Trouble ahead!


if (i == NSNotFound) {
// thought we'd get here, but we don't
NSLog(@"it's not here");
}
else {
// this is what actually happens
NSLog(@"it's here: %d", i);


// **** crash horribly ****
NSLog(@"the object is %@", array[i]);
}
< p > 在专案中更改键 > 建立设定 “ Typecheck 对 printf/Scanf 的调用: 没有

说明: [ How it works ]

检查对 printf 和 Scanf 等的调用,以确保提供的参数具有与指定的格式字符串相适应的类型,并确保在格式字符串中指定的转换是有意义的。

希望能成功

另一个警告

Objective c 隐式转换将失去整数精度‘ NSUInteger’(也称为‘ unsignedlong’)到‘ int’

改变键“ 隐式转换为32Bits Type > Debug > * 64体系结构: No

[ < 强 > 警告: 它可能会使64位架构转换的其他警告无效].

对“ int”进行显式强制转换可以解决我的问题:

int count = (int)[myColors count];