目标c隐式转换丢失整数精度'NSUInteger'(又名'unsigned long')为'int'警告

我正在通过一些练习,并得到一个警告,指出:

隐式转换失去整数精度'NSUInteger'(又名'unsigned long')为'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; } 

截图

NSArraycount方法返回一个NSUInteger ,并在64位OS X平台上

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

所以int是比NSUInteger更小的数据types,因此编译器警告。

另请参见“基础数据types参考”中的NSUInteger :

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

要修复该编译器警告,可以将本地countvariables声明为

 NSUInteger count; 

或者(如果你确信你的数组永远不会包含超过2^31-1元素!),添加一个显式的强制转换:

 int count = (int)[myColors count]; 

与马丁的答案相反,即使你知道你的数组没有超过2 ^ 31-1个元素,转换为int(或忽略警告)并不总是安全的。 不是编译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]); } 

在项目>生成设置中更改键“检查printf / scanfNO

说明: [它如何工作]

检查对printf和scanf等的调用,以确保提供的参数具有与指定的格式string相匹配的types,并且格式string中指定的转换是有意义的。

希望它的工作

其他警告

目标c隐式转换失去整数精度'NSUInteger'(又名'unsigned long')为'int

更改键“ 隐式转换为32位types>debugging> * 64架构:否

[ 注意:这可能会使64位体系结构转换的其他警告无效]

对我的情况做expicit铸造“int”解决了这个问题。 我遇到过同样的问题。 所以:

 int count = (int)[myColors count];