2

经常找到像这样的自定义 setter sintaxis:

- (void)setParentCatalog:(Catalog *)parentCatalog {
    if (_parentCatalog != parentCatalog) { //???
        _parentCatalog = parentCatalog;
        [self refresh];
    }
}

为什么我要检查?

if (_parentCatalog != parentCatalog)
4

4 回答 4

5

这将检查两者是否_parentCatalogparentCatalog都指向相同的内存位置。

如果两者都是同一个对象,则无需设置 objectValue。

于 2013-04-04T08:30:54.283 回答
2

检查两者是否相等的原因是避免在不需要时执行代码。如果该方法被非常频繁地调用,这可能会带来性能优势。在非 ARC 下,您的代码可能看起来更像这样:

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

        _parentCatalog = parentCatalog;

        [self refresh];
    }
}

因此,通过检查您收到的实际上是一个新值,您可以避免发生保留和释放调用(ARC 仍然存在这些调用)。您也进入[self refresh]了那里,除非值实际发生了变化,否则这可能不需要发生。

于 2013-04-04T08:35:08.907 回答
1

这里的想法是,如果传入setter的参数是已经存储在属性中的同一个对象,那么就不需要[self refresh]再次调用。

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

于 2013-04-04T08:35:23.300 回答
1

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

如果您想象自己[self refresh]开始了一项非常昂贵的手术,那么您将不愿意每次都这样做。因此,如果您仅在对象实际更改时才这样做,您可以节省一些工作。

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

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

于 2013-04-04T08:39:02.090 回答