如何在非ARC环境下将弱引用归零?

5

我不喜欢ARC。

但是,在非ARC下,最重要的特性之一——零化弱引用,是缺失的。目前我正在使用MAZeroingWeakRef,它可以工作,但是有些hacky,有时会使代码冗余。是否有其他方法可以实现零化弱引用?


2
在Dealloc中将它们设置为nil有什么问题吗?毕竟这就是零化的全部。 - CodaFi
4
“我不喜欢ARC。”我们应该成为朋友! - Jake
4
你的分析有些奇怪。虽然将弱引用置零是ARC(自动引用计数)中很好的一个功能,但它可能是最不重要的功能之一。ARC 最重要的功能是显著提高时间和空间性能以及更安全的代码(更少崩溃),并且在几乎所有情况下都更容易编写。还有哪个编译器功能可以提供这些全部特点呢?ARC 在iOS 4上没有weak时也跟在iOS 5上一样有价值。https://dev59.com/zGoy5IYBdhLWcg3wHqeB#8760820 - Rob Napier
2
说到ARC,有一个名为https://github.com/plausiblelabs/PLWeakCompatibility的工具,它允许您在不支持ARC环境(iOS4)中使用__weak。 - Farcaller
4
ARC有什么不可爱的呢? - Steve Waddicor
显示剩余3条评论
2个回答

2
实现零弱引用并不难。你需要跟踪所有引用指针 - 将它们存储在集合中 - 并在指向的对象被释放时赋值为NULL。但是,手动完成这些工作确实非常费力,你必须编写所有手动跟踪代码才能在Objective-C中达到足够的效率。
最后,你会发现你需要一些自动代码编写机器 - 静态编译器 - 这正是ARC所做的。你可以自己实现类似ARC的东西。但如果我是你,我会使用由编译器维护者提供的已经存在、健壮、稳定、设计良好并得到支持的实现。
此外,如果你想开发苹果产品,不遵循苹果的行为并不明智。与其他平台持有者(如微软)不同,苹果对于保持向后兼容性并不十分关心。如果他们认为某些东西不好,它将被废弃并最终被删除 - 就像Objective-C GC一样。

1
我认为在引入ARC之前,你应该坚持苹果本身推荐的范例,也就是在-dealloc方法中将所有"weak"引用置为空。这不仅是一种事实上的标准,而且是Xcode代码重构在未启用ARC时的行为方式,因此遵循它应该可以避免一些麻烦。

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