我正在开发自定义 iOS SDK 。我根据自己的要求创建了弱而强大的参考资料。我不清楚的是:什么时候弱参考对象会被解除分配?
假设我有3个对象A,B,C
。 A
对B
的引用较弱,而B
对C
有强引用。
A --- >(weak ref) B --->(strong ref)C
。所有3个对象都是内存中对象。由于B
没有任何强引用,因此可能会取消分配。一旦B
被释放,C
对象内存泄漏。我不能从“c”返回到“B”的强引用,以防止它被取消分配,因为它可能导致保留周期。 ARC将如何决定取消分配B
?我确实理解当对象的最后一个强引用消失时,对象将立即被释放。但没有强烈引用的对象任何原因都是“B”。在这种情况下,什么时候B会被解除分配?
答案 0 :(得分:3)
当最后一个强引用对象消失时,弱引用的对象将立即被释放。请注意,如果对象已被ARC保留并自动释放(实际上是创建了一个额外的临时强引用),那么您的最后一个强引用可能不会完全消失。
答案 1 :(得分:3)
在您的示例中,由于B没有任何强引用,因此可以在任何时候(可能是立即)取消分配。当B被释放时,C没有任何强引用,这也会导致它被解除分配,所以它不会泄漏。
重要的是要理解ARC不是垃圾收集,因为它不会在运行时运行进程,收集不需要的对象。它在编译时工作,当对象不再指向时,在代码中插入dealloc。
答案 2 :(得分:1)
Xcode为您提供了一个提示。我声明了一个弱小的属性:
@property (weak) NSString *weakString;
然后在viewDidLoad
中为其指定一个值:
self.weakString = [[NSString alloc] init];
Xcode将该行标记为:
将保留对象分配给弱属性;对象将在作业后发布
答案 3 :(得分:0)
如果没有强烈引用“B”的对象,则“B”将被取消分配。但是,不确定“B”是否会立即解除分配。
在使用ARC的情况下,我假设“B”是“A”的实例变量,当“A”被解除分配时,B将被立即解除分配。但是,如果ARC随时在 autorelease 池中注册了“B”,则“B”将在“下一个循环周期”中解除分配。