Objective c 是否需要通过objectAtIndex-autorelease返回从NSMutableArray检索的对象?

Objective c 是否需要通过objectAtIndex-autorelease返回从NSMutableArray检索的对象?,objective-c,nsmutablearray,autorelease,Objective C,Nsmutablearray,Autorelease,场景-我有一个方法,该方法返回从NSMutableArray检索到的对象,类似于以下经过简化的代码(假设“myArray”和“currentIndex”是该方法所在类的IVAR): 我应该像这样打电话给自动释放吗 - (MyObject *)getFromArray { return [[myArray objectAtIndex:currentIndex] autorelease]; } 我知道数组在返回所述对象时会对该对象调用autorelease,但我的理解是autoreleas

场景-我有一个方法,该方法返回从NSMutableArray检索到的对象,类似于以下经过简化的代码(假设“myArray”和“currentIndex”是该方法所在类的IVAR):

我应该像这样打电话给自动释放吗

- (MyObject *)getFromArray
{
    return [[myArray objectAtIndex:currentIndex] autorelease];
}
我知道数组在返回所述对象时会对该对象调用autorelease,但我的理解是autorelease对象仅在调用方作用域的持续时间内有效,在本例中,就是上面的方法。那么,添加自动释放(如上面第二段代码所示)是确保所讨论的对象对方法的调用方有效的正确方法吗?我只是想确保我对自动释放系统工作原理的推理和理解是正确的

谢谢

我应该挂个自动释放的电话吗

不!始终遵循简单的内存管理规则:如果您不拥有它(通过
alloc
new
copy
retain
),则不得(自动)释放它

我知道,当数组返回所述对象时,会对该对象调用autorelease

这种假设是错误的。数组只返回对象,不释放它。(它实际上可能会对对象调用
[[…retain]autorelease]
,但这是另一回事。)只有当您从数组中删除对象或数组本身被释放时,数组才会释放对象

我应该挂个自动释放的电话吗

不!始终遵循简单的内存管理规则:如果您不拥有它(通过
alloc
new
copy
retain
),则不得(自动)释放它

我知道,当数组返回所述对象时,会对该对象调用autorelease


这种假设是错误的。数组只返回对象,不释放它。(它实际上可能会调用对象上的
[[…retain]autorelease]
,但这是另一回事。)只有当您从数组中删除对象或数组本身被释放时,数组才会释放对象。

感谢您的澄清。我只是想发布我的代码有问题,因为我对自动释放的(坏)假设!接下来,我是否可以安全地返回从数组中检索到的对象?getFromArray的调用者使用它会不会超出范围而且不安全?我想我读到了一些
autorelease
“在下一次运行循环中,对象会被销毁。”。因此,只要它没有在下一次运行循环中使用,它就会进一步存在。当您运行该方法时,可以在返回的对象上添加一个
retain
语句(当然,稍后再
release
it)。您还可以使用
-copyFromArray
返回[[myArray objectAtIndex:anIndex]retain]并在以后的代码中使用完后释放它。是的,返回它是安全的。正如lef2所说,下次代码将控制权返回到运行循环时,自动释放池将耗尽。只要您返回调用方法,您就可以了。感谢您的澄清。我只是想发布我的代码有问题,因为我对自动释放的(坏)假设!接下来,我是否可以安全地返回从数组中检索到的对象?getFromArray的调用者使用它会不会超出范围而且不安全?我想我读到了一些
autorelease
“在下一次运行循环中,对象会被销毁。”。因此,只要它没有在下一次运行循环中使用,它就会进一步存在。当您运行该方法时,可以在返回的对象上添加一个
retain
语句(当然,稍后再
release
it)。您还可以使用
-copyFromArray
返回[[myArray objectAtIndex:anIndex]retain]并在以后的代码中使用完后释放它。是的,返回它是安全的。正如lef2所说,下次代码将控制权返回到运行循环时,自动释放池将耗尽。只要返回到调用方法,就可以了。
- (MyObject *)getFromArray
{
    return [[myArray objectAtIndex:currentIndex] autorelease];
}