我想了解一点,我知道在这种情况下它可能是微不足道的。
当我打电话时,让我们说:
float w = object.frame.size.width;
程序是否“计算”每次调用它,或者是否将这些数据存储在对象创建中。
我的意思是:
之间的区别(内存使用情况)float w = object.frame.size.width;
float g = object.frame.size.width;
float s = object.frame.size.width;
并且:
float newVar = object.frame.size.width;
float w = newVar;
float g = newVar;
float s = newVar;
由于
沙尼
答案 0 :(得分:2)
object.frame.size.width
可能(在这种情况下,确实)只读取并返回一些c struct属性,但请记住这些可以是真正的objective-c方法调用,例如object.color
。
让我们使用另一个不太明显的例子。您可以在每个对象上调用object.description
以获取该对象的字符串描述。这与方法调用[对象描述]明显相同。你知道为了获得描述还需要做些什么吗?这取决于该方法的实现者,但是没有什么可以阻止他们做一些昂贵,讨厌或其他愚蠢的事情。
object.doSomethingVeryComplicated
会奏效。这不是你应该如何使用点符号,你不应该在你的getter和setter中做一些非常复杂的事情,并且他们永远不应该对你的对象做任何事情(除了懒惰地初始化它),但是没有硬障碍阻止你做这种事情。这是“唯一”的惯例。理论上,你甚至可以做object.tellMeYourColorAndThenGiveYourselfANewRandomColor
。现在显然有第三个不同的答案,第二个例子只有一个答案。
这取决于getter和setter方法的实现者(这是应该通过点符号调用的唯一方法)来确保不会发生这种轻浮,但没有什么能阻止<调用destrucitve方法的方法的em> caller ,这些方法不打算通过点表示法使用。点符号是一个工具,作者,您可以向代码的读者(包括您自己)指示简单的获取/设置操作。
所以,我不认为编译器可以将示例一优化/抽象为示例二。但我不确定,也许它真的会分析代码,因此它会知道何时可能,以及什么时候不可能。或者也许有可能当它真的只是对c结构的访问时,如在你的例子中,但是当它是真正的方法调用时。在任何情况下,你总是知道它是哪一个,含义是什么?我会在代码中明确而不是简洁。