Sprite Kit Только предупреждение о количестве массивов

В наборе спрайтов для iOS 7

    NSMutableArray *temp = [[NSMutableArray alloc] init];
    int x = [temp count];
    NSLog(@"%02d", x);

Этот простой пример выдает это предупреждение

Неявное преобразование теряет целочисленную точность: «NSUInteger» (он же «unsigned long») в «int»

В стандартном проекте приложения точно такой же код не выдает это предупреждение.

Это не большая проблема, и я могу обойти ее с помощью этого

    NSMutableArray *temp = [[NSMutableArray alloc] init];
    NSUInteger x = [temp count];
    NSLog(@"%02lu", x);

Просто хочу знать, почему.

Спасибо


person DogCoffee    schedule 26.09.2013    source источник


Ответы (1)


Может возникнуть проблема при приведении беззнакового типа к целочисленному типу. В частности, если значение беззнакового типа выше INT_MAX / 2, целочисленное значение станет отрицательным.

Как правило, рекомендуется включить это предупреждение и исправить любые такие предупреждения. Например, это один из случаев, когда обратное проблематично:

if (NSUInteger i = 100; i < 0; i--)
{
    // do stuff
}

Заметили проблему?

Эмпирическое правило: всегда заботьтесь о подписании вашего целого числа и никогда не игнорируйте предупреждения о несоответствии между знаками и без знака.

То, что предупреждение появляется только в Sprite Kit, может быть просто связано с обновлением, соответственно, с другим шаблоном проекта.

person LearnCocos2D    schedule 26.09.2013
comment
Спасибо, так моя работа на самом деле единственный способ сделать это правильно? - person DogCoffee; 27.09.2013
comment
Это не обходной путь, это просто правильный код. Пример кода с предупреждением по-прежнему будет работать в 99,9 %, если не в 100 % случаев, но будет давать сбой, если temp содержит действительно большое количество элементов (т. е. 2+ миллиарда). - person LearnCocos2D; 27.09.2013