неявное преобразование objective c теряет целочисленную точность " NSUInteger "(aka "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;
}

4 ответов:
The
countметодNSArrayвозвращаетNSUInteger, а на 64-битной платформе OS X
NSUIntegerопределяется какunsigned longиunsigned long- это 64-разрядное целое число.int- 32-разрядное целое число.так
intэто "меньше", чем типаNSUInteger, поэтому предупреждение компилятора.см. также NSUInteger в разделе " типы данных Foundation Ссылка":
при создании 32-разрядных приложений NSUInteger является 32-разрядным без знака целое число. 64-разрядное приложение обрабатывает NSUInteger как 64-разрядный без знака целое число.
чтобы исправить это предупреждение компилятора, вы можете либо объявить локальный
countпеременнаяNSUInteger count;или (если вы уверены, что Ваш массив не будет содержать более
2^31-1элементы!), добавить явное приведение:int count = (int)[myColors count];
вопреки ответу Мартина, приведение к 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]); }
Изменить ключ в проекте > настройка сборки " typecheck вызывает printf / scanf:нет"
объяснение :[как это работает]
Проверьте вызовы printf и scanf и т. д., чтобы убедиться, что предоставленные аргументы имеют типы, соответствующие указанной строке формата, и что преобразования, указанные в строке формата, имеют смысл.
надеюсь, что он работает
другое предупреждение
неявное преобразование objective c теряет целочисленную точность ' NSUInteger '(aka 'unsigned long') в 'int
Изменить ключ " неявное преобразование в тип 32Bits > Debug > * 64 архитектура: нет"
[внимание: это может привести к аннулированию другого предупреждения о 64-битном преобразовании архитектуры].
выполнение expicit приведения к "int" решает проблему в моем случае. У меня была такая же проблема. Итак:
int count = (int)[myColors count];
Comments