首页 文章

ARC如何在ios中的以下代码片段中工作?

提问于
浏览
0

假设我有一个返回对象指针的方法

-(MyObj *) returnMyObj {
   MyObj *obj = [MyObj alloc] init];
   return obj;
}

如果我调用此函数而不指定像这样的指针

Scenario 1

[self returnMyObj];

如果我调用此函数并赋值给这样的指针

Scenario 2

MyObj* obj = [self returnMyObj];

编译器可以在方案1中的 returnMyObj 方法调用结束时释放该对象,但它在方案2中不能执行相同的操作.ARB如何确定是否需要在方法调用结束时保留创建的对象,或者在两种情况下都不?

2 回答

  • 2

    如果块中稍后未引用 obj ,则优化器可以在语句结束时绝对释放场景2中的对象 .

    重点是优化器可以看到引用指针的时间,并且可以在最后一个引用完成后立即释放它 . obj 没有精确的生命周期语义,因此它只会延长对象的生命周期,直到最后一次引用 obj ,而不是 obj 超出范围时 .

    在方案1中,引用未分配给任何变量,因此它显然没有后来的引用,并且可能会立即释放 . 也就是说,它可能不会立即释放该对象,因为 returnMyObj 不会将所有权转移给调用者(由于其名称) . 因此,在自动释放池耗尽之前,实际上可能不会释放该对象 .

  • 1

    以下是文档中的ARC article所说的内容:

    为了确保实例在仍然需要时不会消失,ARC会跟踪当前引用每个类实例的属性,常量和变量的数量 . 只要至少有一个对该实例的活动引用仍然存在,ARC就不会解除分配实例 . 为了实现这一点,无论何时将类实例分配给属性,常量或变量,该属性,常量或变量都会对实例进行强引用 . 该引用被称为“强”引用,因为它保持对该实例的坚定持有,并且只要该强引用仍然存在就不允许它被释放 .

    ARC决定将哪些对象保存在内存中,哪些对象将通过计算对象的强引用来解除分配 .

    在第二个场景中,您正在创建对 MyObj 实例的强引用,并且ARC在对象使用时不会释放它 . 在这种情况下,当使用此对象的方法完成时,它将被释放 .

相关问题