我正在开发一个自定义iOS SDK . 我根据自己的要求创建了弱而强大的参考资料 . 我不清楚的是: when will the weakly reference object gets de-allocated?
假设我有3个对象 A,B,C
. A
对 B
有弱引用, B
对 C
有强引用 .
A --- >(weak ref) B --->(strong ref)C
所有3个对象都是内存中对象 . 由于 B
没有任何强引用,因此可能会取消分配 . 一旦 B
被释放, C
对象内存泄漏 . 我无法从"c"返回到"B",以防止它被取消分配,因为它可能导致保留周期 . How will ARC takes a decision to de-alloc B? 我明白当对象的最后一个强引用消失时,对象将被立即释放 . 但是没有任何对象强烈引用"B" . 在这种情况下,何时B将被解除分配?
4 回答
当最后一个强引用对象消失时,弱引用的对象将立即被释放 . 请注意,如果对象已被ARC保留并自动释放(实际上是创建了一个额外的临时强引用),那么这可能不完全是您的上一个强引用消失的时间 .
在您的示例中,由于B没有任何强引用,因此可以在任何时候(可能是立即)取消分配 . 当B被释放时,C没有任何强引用,这将导致它被解除分配,所以它不会泄漏 .
重要的是要理解ARC不是垃圾收集,因为它不会在运行时运行进程,收集不需要的对象 . 它在编译时工作,当对象不再指向时,在代码中插入dealloc .
Xcode为您提供了一个提示 . 我宣布一个弱的 property :
然后在
viewDidLoad
我为它分配一个值:Xcode标记该行的警告说:
Assigning retained object to weak property; object will be released after assignment
如果没有强烈引用“B”的对象,则“B”将被解除分配 . 但是,不确定“B”是否会立即解除分配 .
对于ARC的情况,我假设"B"是"A"的实例变量,当"A"被释放时,B将被立即释放 . 但是,如果"B"在任何时候由ARC在 autorelease 池中注册,则"B"将在"next run loop cycle"处取消分配 .