Сеттер Геттер странность @property - PullRequest
2 голосов
/ 26 января 2010

У меня действительно странная проблема при попытке установить значение простого числа равным 1.

Моя собственность:

{
float direction;
}
@property(nonatomic)float direction;

Что синтезируется:

@synthesize direction;

Затем я использовал следующий код:

- (void)setDirection:(float)_direction {
    NSLog(@"Setter called with value of %f",_direction);
    self->direction = _direction;
}

Для целей тестирования ...

Когда я пытаюсь изменить это значение,

[[w getCharacter] setDirection:1.0f];

, где [w getCharacter] дает это:

return [[[self scene] gameLayer] player];

Я получаю предупреждение: «setDirection не определено».

Если я переключаюсь на точечную запись ([w getCharacter].direction), меня "смущают более ранние ошибки, выручающие".

Вот тут и начинается странность. Когда я пытаюсь изменить значение, в сообщении отладки отображается _direction = 0.00000. Когда я проверю номер позже, его все еще 0,000. Я явно пытаюсь изменить его на 1, почему это не работает?

Ответы [ 2 ]

1 голос
/ 26 января 2010

Самое простое объяснение состоит в том, что [w getCharacter] не возвращает класс объекта, который вы думаете, что он делает. Только класс, для которого определено направление, может ответить на сообщение. Вы должны проверить это, явно вызвав его с классом, для которого он определен.

Возможно, вы не включили заголовок, который определяет метод.

Два, вероятно, не связанных вопроса:

Конструкция self->direction будет работать для скалярного значения, но она обходит всю концепцию класса. В этом случае просто используйте: 'direction = _direction; `, и он установит его напрямую.

Apple резервирует все имена, начинающиеся с подчеркивания, для собственного внутреннего использования. Вы не должны использовать их, потому что Objective-c имеет глобальное пространство имен. Вполне возможно, что вы можете случайно использовать переменную Apple, которая определена глубоко внутри фреймворка. (Вот почему все каркасные константы начинаются с NS, CF, CA и т. Д.)

1 голос
/ 26 января 2010

[Примечание: в комментариях автор говорит игнорировать этот ответ.

self.direction = 1; является синтаксическим сахаром для

[self setDirection: 1];

при звонке

   -(void)setDirection:(float)_newDirection {
       self.direction = _newDirection;
}

Кажется, вы говорите компилятору или препроцессору настроить рекурсивный цикл для вас. Препроцессор (я думаю) меняет это на следующее:

-(void)setDirection:(float)_newDirection {
       [self setDirection: _newDirection];
 }

Если вы называете это просто

    -(void)setDirection:(float)_newDirection {
      direction = _newDirection;
}

назначение должно работать (у меня это сработало только сейчас)

...