2

我正在开发一个自定义iOS SDK。我正在根据我的要求创建弱而强的引用。我不清楚的是:弱引用对象何时会被解除分配?

假设我有 3 个对象A,B,CA对 有弱引用BB对 有强引用C

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

4

4 回答 4

3

在您的示例中,由于 B 没有对它的任何强引用,因此可以随时(可能立即)释放它。当 B 被释放时,C 没有任何强引用它会导致它也被释放,所以它不会泄漏。

重要的是要了解 ARC 不是垃圾收集,因为它不会在运行时运行进程,收集不需要的对象。它在编译时工作,当对象不再指向时在代码中插入 dealloc。

于 2014-02-12T08:06:16.877 回答
3

当对它们的最后一个强引用消失时,弱引用的对象将立即被释放。请注意,如果对象已被 ARC 保留并自动释放(本质上是创建一个额外的临时强引用),那可能不是最后一个强引用消失的确切时间。

于 2014-02-12T07:06:14.503 回答
1

Xcode 给你一个提示。我声明一个弱属性:

@property (weak) NSString *weakString;

然后在viewDidLoad我给它赋值:

self.weakString = [[NSString alloc] init];

Xcode 用一条警告标记该行:

将保留对象分配给弱属性;分配后对象将被释放

于 2014-02-12T08:33:03.330 回答
0

如果没有对象强引用“B”,“B”将被释放。但是,不确定是否会立即释放“B”。

在您使用 ARC 的情况下,我假设“B”是“A”的实例变量,当“A”被释放时,B 将立即被释放。但是,如果“B”在任何时候被 ARC 注册到自动释放池中,“B”将在“下一个运行循环周期”被释放。

于 2014-02-12T08:09:01.220 回答