假设我有一个返回对象指针的方法
-(MyObj *) returnMyObj {
MyObj *obj = [MyObj alloc] init];
return obj;
}
如果我调用此函数而不指定像这样的指针
Scenario 1
[self returnMyObj];
如果我调用此函数并赋值给这样的指针
Scenario 2
MyObj* obj = [self returnMyObj];
编译器可以在方案1中的 returnMyObj 方法调用结束时释放该对象,但它在方案2中不能执行相同的操作.ARB如何确定是否需要在方法调用结束时保留创建的对象,或者在两种情况下都不?
2 回答
如果块中稍后未引用
obj
,则优化器可以在语句结束时绝对释放场景2中的对象 .重点是优化器可以看到引用指针的时间,并且可以在最后一个引用完成后立即释放它 .
obj
没有精确的生命周期语义,因此它只会延长对象的生命周期,直到最后一次引用obj
,而不是obj
超出范围时 .在方案1中,引用未分配给任何变量,因此它显然没有后来的引用,并且可能会立即释放 . 也就是说,它可能不会立即释放该对象,因为
returnMyObj
不会将所有权转移给调用者(由于其名称) . 因此,在自动释放池耗尽之前,实际上可能不会释放该对象 .以下是文档中的ARC article所说的内容:
ARC决定将哪些对象保存在内存中,哪些对象将通过计算对象的强引用来解除分配 .
在第二个场景中,您正在创建对
MyObj
实例的强引用,并且ARC在对象使用时不会释放它 . 在这种情况下,当使用此对象的方法完成时,它将被释放 .