自定义getter / setter无效

时间:2015-11-18 13:29:17

标签: ios objective-c macos

我有一个属性有时需要成为一个强引用,其他时候需要一个弱引用。我以为我用以下自定义getter / setter破解了它:

- (PropertyData *)property
{
    return _strongProperty? _strongProperty : _weakProperty;
}

- (void)setProperty:(PropertyData *)newProperty
{
    _strongProperty = newProperty;
    _weakProperty = nil;
}

- (void)weaken
{
    if (_strongProperty != nil) {
        _weakProperty = _strongProperty;
        _strongProperty = nil;
    }
}

以前有一个名为property@synthesize property的ivar。我删除了两个并替换为:

PropertyData __weak *_weakProperty;
PropertyData *_strongProperty;

使用此类的类在想要转换为弱引用时调用weaken以防止保留周期。

这一切都适用于iOS,但在OS X上运行相同的代码根本不起作用。在调试器中,setProperty:从一开始就对新的ivars没有任何影响,并且在调用weaken之前崩溃。

我很困惑在编写自定义getter / setter(部署目标OS X 10.10)时是否需要@synthesize a=b语句。在这种情况下如何做到这一点并不明显,因为有两个支持ivars。

1 个答案:

答案 0 :(得分:1)

遵循惯例,或者让包括你自己在内的任何人感到困惑。

使用下划线启动实例变量。不要使用合成。

除此之外,你有两个问题。一,调用弱化两次将属性设置为零。其次,您的财产很可能只有一个参考计数,当您打电话削弱时,它就会消失。