我有一个属性有时需要成为一个强引用,其他时候需要一个弱引用。我以为我用以下自定义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。
答案 0 :(得分:1)
遵循惯例,或者让包括你自己在内的任何人感到困惑。
使用下划线启动实例变量。不要使用合成。
除此之外,你有两个问题。一,调用弱化两次将属性设置为零。其次,您的财产很可能只有一个参考计数,当您打电话削弱时,它就会消失。