2013-04-04 51 views

回答

5

这用来检查既_parentCatalogparentCatalog都指向相同的存储器位置。

如果两者都是相同的对象,则不需要设置objectValue。

2

检查两者是否相等的原因是为了避免在没有必要时执行代码。如果该方法经常被调用,这可能会带来性能上的好处。在非ARC,你的代码看起来更像是这样的:

- (void)setParentCatalog:(Catalog *)parentCatalog { 
    if (_parentCatalog != parentCatalog) { 
     [_parentCatalog release]; 
     [parentCatalog retain]; 

     _parentCatalog = parentCatalog; 

     [self refresh]; 
    } 
} 

所以,通过检查一下你是否收到什么实际上是一个新的价值,你避开那些保留和释放调用发生(其中仍然存在与ARC) 。你也有[self refresh]在那里,这可能不需要发生,除非值已经改变。

+0

+1喜欢你的'保留'的例子 – 2013-04-04 08:44:09

+0

我知道你首先比较对象,但通常你应该保留,然后释放。如果对象相同(如果您先比较它们,则不是这种情况),您可能会丢失它并进入内存问题。对于现今ACR时代的这种旧货不好意思。 – user500 2013-08-01 07:54:29

1

这里的想法是,如果传递给setter的参数与已存储在属性中的相同对象相同,则不需要再次调用[self refresh]

刷新方法通常读入数据,对其进行处理,然后将其重新显示在应用程序的视图中。如果属性中的数据没有真正改变,则不需要再做所有这些工作。

1

这是一个依赖于用例的决定。这个守卫背后的想法是防止做不必要的工作。

如果你认为你的[self refresh]开始了一个非常昂贵的操作,那么你将不愿意每次都这样做。所以如果你只是在对象实际发生变化时才这样做,那么你可以节省一些工作。

当然,这可能是您寻找的行为,在这种情况下,您需要将[self refresh]呼叫保持在警卫之外。

与所有代码示例一样,您认为值得权衡实现的权衡,然后您可以更好地决定自己需要什么。