Objective-C: геттеры не следует использовать для предупреждения компилятора о побочных эффектах

Может кто проясняет, что здесь происходит. У меня есть класс под названием: brainModel, и у него снова есть NSArray под названием: operandStack. Я просто обращаюсь к массиву, отправляя ему сообщение «removeAllObjects»

self.brainModel.operandStack.removeAllObjects;

но при использовании точечной записи я получаю предупреждение: «Результат доступа к свойству не используется - геттеры не должны использоваться для побочных эффектов». Что именно это означает?

использование синтаксиса вложенных скобок не дает предупреждений:

 [[[self brainModel]operandStack]removeAllObjects];

оба работают, кстати ... это имеет какое-то отношение к неправильному использованию точечной записи? или считается хорошей практикой использовать точечную нотацию при обмене сообщениями с подобными объектами - отправляя ему аргументы типа «removeAllObjects».


person Tom Lilletveit    schedule 15.08.2012    source источник
comment
Вероятно, вы видите, что removeAllObjects имеет тип возвращаемого значения void, поэтому вы, очевидно, не используете его в качестве получателя.   -  person Paul.s    schedule 15.08.2012
comment
@ Paul.s совсем нет, скоро увидим мой ответ.   -  person    schedule 15.08.2012


Ответы (3)


removeAllObjects не является собственностью; это метод.

Использование нотации доступа к свойствам работает, потому что доступ к свойствам обычно осуществляется с помощью метода с тем же именем. Однако ожидается, что получение значения свойства не изменит объект, который содержит объект (или внесет какие-либо другие изменения), что не относится к removeAllObjects. Это «побочные эффекты», о которых говорит компилятор.

Возможно, вы захотите вместо этого выполнить этот вызов:

[self.brainModel.operandStack removeAllObjects];

Он получает свойство brainModel для self, затем свойство operandStack для self.brainModel, затем вызывает removeAllObjects для него.

person mrb    schedule 15.08.2012

removeAllObjects - это метод. Вы не можете получить доступ к методам через точечную нотацию; только свойства.

person Oh Danny Boy    schedule 15.08.2012
comment
Можно, но нужно ли? Это своего рода вопрос морали и религии. - person Hot Licks; 18.04.2014

Вам не нужно объявлять каждый метод как свойство, особенно если они изменяют объект. Геттеры следует рассматривать как средства доступа к свойству (без прямого раскрытия поддерживающего ivar). Методы, которые, скажем, являются «действиями», должны быть объявлены как таковые (т. Е. Объявлены без ключевого слова @property и вызваны с использованием скобок вместо записи через точку).

person Community    schedule 15.08.2012
comment
Это не объясняет, почему мое предложение было неправильным? Я могу законно объявить метод с возвращаемым значением и использовать его с точечной нотацией. Обратите внимание на - (NSUInteger)count; в NSArray, он не объявлен как @property (nonatomic, assign, readonly) NSUInteger count, но многие люди используют его в любом случае без проблем. Хотя ваш ответ объясняет философию использования свойств, я не думаю, что он объясняет стоны компилятора. - person Paul.s; 15.08.2012
comment
@ Paul.s да, просто кажется, что вы не понимаете, что компилятор жалуется не на синтаксическую ошибку, а на философию, лежащую в основе синтаксиса. - person ; 15.08.2012
comment
Согласен, что важна именно философия, но я просто заявлял, что компилятор должен работать над сигнатурой метода, имеющей void return, так как иначе он мог бы узнать, что у него есть побочные эффекты - помня, что я могу законно добавить побочные эффекты, если моя подпись метода действительно что-то возвращает. - person Paul.s; 15.08.2012