覆盖Objective-c中的设置器。为什么校验是等参数
通常会发现自定义setter轴如下所示:覆盖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 {
- (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。