Objective-C:不应将getters用于副作用编译器警告

时间:2012-08-15 15:24:38

标签: objective-c methods nsarray notation

有人可以澄清这里发生的事情。我得到了一个名为:brainModel的类,它又有一个名为:operandStack的NSArray。我只是访问数组,发送消息“removeAllObjects”

self.brainModel.operandStack.removeAllObjects;

但是使用点符号它会给我一个警告“未使用属性访问结果 - 不应将getter用于副作用”这究竟是什么意思?

使用这样的嵌套括号语法不会发出警告:

 [[[self brainModel]operandStack]removeAllObjects];

这两项工作顺便说一下......它是否与错误使用点符号有关?或者在传递像这样的消息对象时使用点表示法被认为是一种好的做法 - 发送像“removeAllObjects”这样的参数。

3 个答案:

答案 0 :(得分:5)

removeAllObjects不是财产;这是一种方法。

使用属性访问表示法是有效的,因为通常使用相同名称的方法访问属性。但是,期望获取属性的值不会更改包含对象的对象(或进行任何其他更改),而removeAllObjects则不然。这些是编译器所指的“副作用”。

或许,您可能希望执行此调用:

[self.brainModel.operandStack removeAllObjects];

这会获得brainModel的{​​{1}}属性,然后是self的{​​{1}}属性,然后在其上调用operandStack

答案 1 :(得分:1)

removeAllObjects是一种方法。您无法通过点表示法访问方法;只有属性。

答案 2 :(得分:0)

您不需要将每个方法声明为属性 - 尤其是在它们正在修改对象时。应将getters视为属性的访问者(不直接暴露支持ivar)。比如,'actions'的方法将被声明为(例如,在没有@property关键字的情况下声明,并使用括号而不是点符号来调用)。