NSArray в если заявление странное поведение - PullRequest
2 голосов
/ 08 августа 2010

у меня есть следующие две части кода, которые, я думаю, должны быть идентичны

int temp = [[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state];
if (temp > 0)
{
    NSLog(@"TEST: %d",temp);
}

if ([[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state] > 0)
{
    NSLog(@"TEST: %d",temp);
}

состояние - это просто int в объектах в массиве с аксессором, например:

@property (assign)int state;

но когда состояние отрицательное, первая версия работает (без вывода), но вторая версия выводит (например) "TEST: -4" (?!)

есть ли очевидная причина, по которой они могут отличаться?

Ответы [ 2 ]

2 голосов
/ 08 августа 2010

Поскольку -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) {
 ...
0 голосов
/ 08 августа 2010

Я правильно понимаю, и два if, если NOT в том же методе, то второй выводит неназначенную переменную. исправление должно выглядеть следующим образом:

if ((temp = [[[myArray objectAtIndex:iIndex] objectAtIndex:jIndex] state]) > 0)
{
    NSLog(@"TEST: %d",temp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...