注意:这是由于一些XCode测试版中的错误已经修复。如果您遇到ARC问题,此问题和答案可能无法帮助您。
我正在将我的项目从手动引用计数迁移到ARC,并偶然发现了一个问题: 如何确保保留属性的自定义setter实际保留?
在 myClass.h
,我宣布了一个财产: @property (retain) NSDate *date
。我是否手动设置一个并不重要 __strong
ivar或自动生成。
在实施中,我当然有 @synthesize date
,并实现了一个自定义setter(或只是 下载演示Xcode项目):
- (void)setDate:(NSDate *)newDate
{
if (allowedToSetNewDate)
{
date = newDate;
}
}
这似乎没有保留日期,并给了我 message sent to deallocated instance
当newName是(自动)释放它来自哪里时,尝试访问时 myClass.date
稍后(提供Zombie启用;否则,它只是静默崩溃)。
更改要使用的setter date = [newDate copy]
解决错误,但不是我想要的。删除自定义setter也有效,但显然不是必需的。
我在这里想念的是什么?如何确保保留属性的自定义setter实际保留在ARC环境中?这似乎是一项基本而且常见的任务,我认为我忽略了一些非常明显的事情。
(注意:这不属于任何Apple NDA的条款,因为ARC作为LLVM的一部分公开发布)
编辑:我已经创建了一个小型Xcode项目来演示该问题并将其上传到github。随意地 下载它 和玩耍。我的机智已经结束了(尽管我的机智今天并不是最好的,不可否认)。
编辑:对于此示例项目,此问题已解决(请参阅接受的答案)。不幸的是,在我无法分享的更大的项目中,问题仍然存在。作为一种解决方法,我添加了重复 strong
具有合成setter的属性(ivars不起作用)。新的自定义setter现在看起来像这样:
- (void)setDate:(NSDate *)newDate
{
if (allowedToSetNewDate)
{
self.date_arcretain = newDate; //this property is only there as a workaround. ARC properly retains it, but only if the setter is synthesized
date = newDate;
}
}