在ARC中清空弱引用

45
如果我对 Mike Ash 的"零化弱引用"的解释正确的话,弱引用就像没有 ARC 的assign 引用。但是,如果被引用的对象被释放了,指针将被设置为nil,而不是变成一个"悬挂指针"(指向一个被释放的对象的指针)。
这个描述正确吗?在 ARC 激活时,任何标记为 weakassign 的属性都会发生这种情况吗?
如果是这样的话,这将消除许多 SIGABRTs。
1个回答

38

这大部分是正确的,但是assign属性仍然像以前一样处理,只有weak属性会被置零。另一个注意点是,零值弱引用仅在Mac OS X ≥ 10.7和iOS ≥ 5中提供。虽然ARC的其余部分已经回溯到了10.6和iOS 4,但是在这些操作系统上根本无法使用弱引用。


6
感谢@cobbal提供的信息。至少在XCode 4.2 beta中,如果您的部署目标小于iOS 5,则不能在属性声明中使用weak:您必须使用assign。错误信息为error: the current deployment target does not support automated __weak references - Dan Rosenstark
1
谢谢 @Yar,我一直在遇到这个错误,但不知道它来自哪里! - Pascal
3
@MarkAdams,是的,但正如名称所示,它们不安全。当弱引用所指向的对象被销毁时,弱引用变为 nil。然而,使用 unsafe_unretained 引用时,引用仍然指向相同的(现在已释放的)内存块,发送到该引用的任何消息都可能导致段错误。 - cobbal
1
进一步说明:Mac OS X 10.6仅支持64位应用程序;32位代码使用传统运行时,无法使用ARC。 - Rob Rix
1
@chaiguy 是的,weak 属性只是意味着它使用了一个 __weak 实例变量,所以它们完全相同。 - cobbal
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接