我正在开发一个自定义的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什么时候会被取消分配?
弱引用对象将在最后一个强引用消失时立即解除分配。请注意,如果对象已被 ARC 保留并自动释放(实质上是创建一个额外的临时强引用),则可能不完全是最后一个强引用消失的时间。
在您的示例中,由于 B 没有任何对它的强引用,因此可以随时(可能立即)释放它。当 B 被解除分配时,C 没有任何强引用,这也会导致它被释放,所以它不会泄漏。
重要的是要了解 ARC 不是垃圾回收,因为它不会在运行时运行进程,收集不需要的对象。它在编译时工作,当对象不再指向时,在代码中插入 dealloc。
Xcode 会给你一个提示。我声明一个弱属性:
@property (weak) NSString *weakString;
然后在viewDidLoad
中,我给它分配了一个值:
self.weakString = [[NSString alloc] init];
Xcode 用警告标记该行
:将保留对象分配给弱属性;对象将在分配后释放
如果没有对象强烈引用"B","B"将被解除分配。 但是,不确定"B"是否会立即释放。
在您使用 ARC 的情况下,我假设"B"是"A"的实例变量,当"A"被释放时,B 将立即被释放。但是,如果 ARC 在任何时候在自动发布池中注册了"B",则"B"将在"下一个运行循环周期"中解除分配。