неявное преобразование 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;

}


Screenshot

554   4  

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

    Ничего не найдено.