释放弱引用iOS

时间:2014-02-12 07:00:04

标签: ios memory-management automatic-ref-counting weak-references strong-references

我正在开发自定义 iOS SDK 。我根据自己的要求创建了弱而强大的参考资料。我不清楚的是:什么时候弱参考对象会被解除分配?

假设我有3个对象A,B,CAB的引用较弱,而BC有强引用。

A --- >(weak ref) B --->(strong ref)C。所有3个对象都是内存中对象。由于B没有任何强引用,因此可能会取消分配。一旦B被释放,C对象内存泄漏。我不能从“c”返回到“B”的强引用,以防止它被取消分配,因为它可能导致保留周期。 ARC将如何决定取消分配B我确实理解当对象的最后一个强引用消失时,对象将立即被释放。但没有强烈引用的对象任何原因都是“B”。在这种情况下,什么时候B会被解除分配?

4 个答案:

答案 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”将在“下一个循环周期”中解除分配。