Objective-C:自定义setter中的if语句

时间:2012-09-26 19:05:07

标签: objective-c getter-setter

自定义setter中if语句的用途是什么?我在示例代码中看到了很多例程。使用ARC提供,为什么还要检查相等性?

- (void)setPhotoDatabase:(UIManagedDocument *)photoDatabase
{
    if (_photoDatabase != photoDatabase) {
        _photoDatabase = photoDatabase;
        ...
    }
}

4 个答案:

答案 0 :(得分:2)

重要的部分通常是改变后的内容(...中的内容):分配新值后的副作用,这可能非常昂贵。

限制这些更改以避免触发不必要且可能非常昂贵的副作用是个好主意。假设您更改了文档,那么您可能需要更改与该文档相关的ui的大部分,以及模型更改。

当检查条件时,大量不必要/变更工作可能会被短路,最终可能会避免进行不必要的更改。

这种不必要的副作用可能很容易使你的应用程序关于CPU,绘图,对象创建,写入磁盘的实际工作黯然失色 - 几乎任何事情。

不管你信不信,很多应用程序确实会执行大量不必要的工作,即使它们设计得非常好。基于视图的渲染系统中的绘图和ui更新可能是我能想到的最好的例子。在该领域,可以实施的大量细节可以最大限度地减少冗余绘图。

答案 1 :(得分:1)

覆盖和实现自定义setter的主要原因之一是执行其他代码以响应属性的更改。如果属性实际上没有改变,为什么要执行该代码?

答案 2 :(得分:1)

答案通常在你已注释掉的...部分:当没有任何内容时,代码没有意义。但是,在那个地方有一个典型的东西是你自己的代表的某种通知,如:

[myDelegate photoDatabaseDidChanged:photoDatabase];

除非photoDatabase确实发生变化,否则不应调用此方法。从“昂贵”到“非常昂贵”,这种呼叫可能代价高昂,具体取决于代表的确做什么。它可能是使用新库中的图像更新屏幕,也可能是将新图像保存到云中。如果不需要报告更改,则可能会浪费CPU周期以及电池和网络带宽。您的代码无法知道委托将要执行的操作,因此除非确实发生了更改,否则您需要避免回调。

答案 3 :(得分:0)

如果检查是否相等,则可以阻止传递给方法的参数的冗余分配。

这样,如果样本方法中的photoDatabase没有变化,您可以避免在括号内执行所有代码的成本(即使它很小)。

Ex(扩展你的例子):

- (void)setPhotoDatabase:(UIManagedDocument *)photoDatabase
{
    if (_photoDatabase != photoDatabase) 
    {
        _photoDatabase = photoDatabase;

        // do stuff
        // do more stuff
        // do even more stuff
        // do something really expensive
    }
}

从示例中可以看出,如果首先检查photoDatabase是否与传入的内容不相等,则可以退出该方法,而不是运行其他不必要的代码。