Поскольку -objectAtIndex:
возвращает id
, компилятор не сможет знать, что должен возвращать -state
. Если вы не импортировали заголовок, который сначала объявляет state
, или если свойство state
имеет неоднозначное объявление (например, другой класс объявил @property(retain) id state
до вашего класса), то компилятор может выведите неверный тип для -state
.
Если он выводит, например, id
, так как все указатели неотрицательны, -4
будет неявно рассматриваться как 0xFFFFFFFC
, таким образом, условие> 0 выполнено.
Но для кода 1 вы указали, что temp
является int
, поэтому, даже если возвращаемое значение вызова равно 0xFFFFFFFC
, оно будет преобразовано обратно в значение со знаком (-4
), следовательно, условие не выполняется.
Самый безопасный подход - указать тип -objectAtIndex:
, т.е.
Foo* obj = [[myArray objectAtIndex:iIndex] objectAtIndex:jIndex];
if (obj.state > 0) {
...