覆盖保留属性的Setter

时间:2011-08-02 15:40:51

标签: objective-c properties

在覆盖retain属性的默认setter时,有没有办法避免这种代码?

-(void)setMasterViewController:(UIViewController *)newMaster {
    [newMaster retain];
    [masterViewController release];
    masterViewController = newMaster;

    // do custom stuff on set
}

有没有办法访问默认的setter,例如:

-(void)setMasterViewController:(UIViewController *)newMaster {
    [defaultSetMasterViewController:newMaster];
    // do custom stuff
}

这将使代码保持DRYer。我现在这样做的方式,它是一个retain属性的事实被提到两次。

2 个答案:

答案 0 :(得分:1)

不是真的,因为setter必须执行实际设置。如果你想保留原始的setter,你可以尝试使用键值观察来做到这一点。

然而......是的,如果你正在使用ARC!如果您有@property (strong),那么只需说masterViewController = newMaster ARC就会使用objc_storeStrong,其中:{/ p>

  

执行分配给非块类型的__strong对象的完整序列。相当于以下代码:

id objc_storeStrong(id *object, id value) {
  value = [value retain];
  id oldValue = *object;
  *object = value;
  [oldValue release];
  return value;
}

答案 1 :(得分:1)

CoreData生成原始setter,但一般来说没有这样的可供性​​。在某些情况下,您可以使用键值观察来替换自定义setter,但如果您可以将支持限制在10.6 + / 4.3 +,那么您的特定问题的解决方案可能是“使用ARC”。它将代表您处理保留/发布内容。