返回通过 objectAtIndex 从 NSMutableArray 检索到的对象 - 需要自动释放吗?

Posted

技术标签:

【中文标题】返回通过 objectAtIndex 从 NSMutableArray 检索到的对象 - 需要自动释放吗?【英文标题】:returning an object retrieved from an NSMutableArray via objectAtIndex - autorelease necessary? 【发布时间】:2011-04-21 23:22:11 【问题描述】:

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

- (MyObject *)getFromArray

    return [myArray objectAtIndex:currentIndex];

我应该像这样调用自动释放吗?

- (MyObject *)getFromArray

    return [[myArray objectAtIndex:currentIndex] autorelease];

我知道数组在对象上调用 autorelease,因为它返回所述对象,但我的理解是 autoreleased 对象仅在调用者范围内有效,在本例中为上述方法。那么,添加自动释放(如上面第二个代码 sn-p 所示)是确保有问题的对象对我的方法的调用者有效的正确方法吗?只是想确保我对自动释放工作原理的推理和理解是正确的。

谢谢!

【问题讨论】:

【参考方案1】:

我应该接听自动释放的电话吗?

不!始终遵循简单的内存管理规则:如果您不拥有它(allocnewcopyretain),则不得(自动)释放它。

我知道数组在对象上调用 autorelease,因为它返回所述对象

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

【讨论】:

感谢您的澄清。我只是要发布我的代码有问题,因为我对自动释放的(错误)假设! 作为后续,我可以安全地返回从数组中检索到的对象吗?它不会超出范围并且对于 getFromArray 的调用者使用不安全吗? 我以为我读到了 autorelease'ed 对象在下一个运行循环中被销毁。因此,只要它没有在下一个运行循环中使用,它就会进一步存在。当您运行该方法时,您可以在返回的对象上添加 retain 语句(当然稍后再添加 release 它)。您也可以使用- copyFromArrayreturn [[myArray objectAtIndex:anIndex] retain];,并在您完成后续代码时释放它。 是的,只要退回它就安全了。正如 lef2 所说,下次您的代码将控制权返回给运行循环时,自动释放池会被耗尽。只要您返回到调用方法就可以了。

以上是关于返回通过 objectAtIndex 从 NSMutableArray 检索到的对象 - 需要自动释放吗?的主要内容,如果未能解决你的问题,请参考以下文章

ios 判断objectAtIndex 为空

CVMetalTextureCacheCreateTextureFromImage 总是返回 null

objectAtIndex 没有在 segue 中传递选定的行

安全的 NSArray 访问

我们可以通过使用@try,catch 机制来防止崩溃吗?如果错误是 -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty arra

如何使用 Swift 访问 tabBarController 中的 ObjectAtIndex?