重用变量的最佳实践?

时间:2011-06-19 09:15:06

标签: objective-c memory-management

我想了解一点,我知道在这种情况下它可能是微不足道的。

当我打电话时,让我们说:

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;

由于

沙尼

1 个答案:

答案 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结构的访问时,如在你的例子中,但是当它是真正的方法调用时。在任何情况下,总是知道它是哪一个,含义是什么?我会在代码中明确而不是简洁。