覆盖Objective-c中的设置器。为什么校验是等参数

覆盖Objective-c中的设置器。为什么校验是等参数,objective-c,getter-setter,Objective C,Getter Setter,通常会发现自定义setter轴如下所示: - (void)setParentCatalog:(Catalog *)parentCatalog { if (_parentCatalog != parentCatalog) { //??? _parentCatalog = parentCatalog; [self refresh]; } } - (void)setParentCatalog:(Catalog *)parentCatalog {

通常会发现自定义setter轴如下所示:

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

        _parentCatalog = parentCatalog;

        [self refresh];
    }
}
我为什么要检查

if (_parentCatalog != parentCatalog)

这将检查
\u parentCatalog
parentCatalog
是否都指向相同的内存位置


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

检查两者是否相等的原因是避免在不必要时执行代码。如果经常调用该方法,这可能会提高性能。在非ARC模式下,您的代码可能更像这样:

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

        _parentCatalog = parentCatalog;

        [self refresh];
    }
}

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

这里的想法是,如果传递给setter的参数是已存储在属性中的同一对象,则无需再次调用
[自刷新]


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

这是一个取决于用例的决定。这种防护措施的目的是防止做不必要的工作

如果你想象你的
[self-refresh]
启动了一个非常昂贵的操作,那么你就不愿意每次都这么做。因此,如果只在对象实际发生更改时执行此操作,则可以为自己节省一些工作

当然,这可能是您正在寻找的行为,在这种情况下,您需要将
[self-refresh]
调用粘贴到防护之外


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

我知道您首先比较对象,但通常应该先保留,然后发布。如果对象是相同的(如果您首先比较它们,则不是这种情况),则可能会丢失对象并导致内存问题。很抱歉在当今的ACR时代发生了这样的OT。