Сравнение количества NSArray с целочисленным значением приводит к неправильному выполнению кода

#objective-c #ios

#objective-c #iOS

Вопрос:

Я столкнулся со своеобразной проблемой в программе для iPhone. Это мой код —

В viewDidLoad моего контроллера представления я создаю массив

 grades = [[NSArray arrayWithObjects:@"Grade 1", @"Grade 2", @"Grade 3", nil] retain];
  

Теперь у меня есть свойство

 @property (nonatomic) NSInteger selectedGradeIndex;
  

И я написал следующий метод установки

 - (void) setSelectedGradeIndex:(NSInteger)newValue
{
  if(newValue >= [grades count])
  {
    NSLog(@"newValue = %d >= [grades count] = %d",newValue, [grades count]);
    newValue = 0;
  }
  else if(newValue < 0)
  {
    NSLog(@"newValue = %d < 0",newValue);
    newValue = [grades count] - 1;
  }

  selectedGradeIndex = newValue;
  lblGrade.text=  [grades objectAtIndex:selectedGradeIndex];
}
  

Где-то в коде у меня есть

 self.selectedGradeIndex = -1;
  

Журнал внутри установщика показывает

 newValue = -1 >= [grades count] = 6
  

Я в замешательстве. Почему элемент управления будет входить в первое условие if, когда журнал ясно показывает, что условие ложно.

Я изменил установщик на

 - (void) setSelectedGradeIndex:(NSInteger)newValue
{
  int count = [grades count];
  if(newValue >= count)
  {
    NSLog(@"newValue = %d >= count = %d",newValue, count);
    newValue = 0;
  }
  else if(newValue < 0)
  {
    NSLog(@"newValue = %d < 0",newValue);
    newValue = count - 1;
  }

  selectedGradeIndex = newValue;
  lblGrade.text=  [grades objectAtIndex:selectedGradeIndex];
}
  

И теперь все работает так, как ожидалось. Журнал

 newValue = -1 < 0
  

Может кто-нибудь сказать мне, почему предыдущий метод не работает?

Ответ №1:

Когда вы сравниваете signed int (вашу переменную) с unsigned int (тип -[NSArray count] , подписанный int повышается до unsigned . Число -1 преобразуется в чрезвычайно большое значение без знака int . Таким образом, -1 > 6 .