将NSArray的计数与整数值进行比较会导致代码执行错误

Sre*_*jit 4 objective-c ios

我在iPhone程序中遇到了一个特殊的问题.这是我的代码 -

在我的视图控制器的viewDidLoad中,我创建了一个数组

grades = [[NSArray arrayWithObjects:@"Grade 1", @"Grade 2", @"Grade 3", nil] retain];
Run Code Online (Sandbox Code Playgroud)

现在我有一个房产

@property (nonatomic) NSInteger selectedGradeIndex;
Run Code Online (Sandbox Code Playgroud)

我写了以下setter方法

- (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];
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中的某个地方

self.selectedGradeIndex = -1;
Run Code Online (Sandbox Code Playgroud)

setter中的日志显示

newValue = -1 >= [grades count] = 6
Run Code Online (Sandbox Code Playgroud)

我很迷惑.当日志清楚地显示条件为假时,为什么控制进入第一个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];
}
Run Code Online (Sandbox Code Playgroud)

现在一切都按预期工作了.日志是

newValue = -1 < 0
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我为什么早期的方法失败了吗?

Chu*_*uck 7

当你将signed int(你的变量)与unsigned int(type的类型)进行比较时-[NSArray count],signed int被提升为unsigned.这个数字-1转换为一个非常大的unsigned int.因此,-1 > 6.