返回通过 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】:我应该接听自动释放的电话吗?
不!始终遵循简单的内存管理规则:如果您不拥有它(alloc
、new
、copy
或 retain
),则不得(自动)释放它。
我知道数组在对象上调用 autorelease,因为它返回所述对象
这个假设是错误的。数组只返回对象,不会释放它。 (它实际上可能在对象上调用[[... retain] autorelease]
,但这是另一回事。)只有当您从数组中删除对象或数组本身被释放时,数组才会释放对象。
【讨论】:
感谢您的澄清。我只是要发布我的代码有问题,因为我对自动释放的(错误)假设! 作为后续,我可以安全地返回从数组中检索到的对象吗?它不会超出范围并且对于 getFromArray 的调用者使用不安全吗? 我以为我读到了autorelease
'ed 对象在下一个运行循环中被销毁。因此,只要它没有在下一个运行循环中使用,它就会进一步存在。当您运行该方法时,您可以在返回的对象上添加 retain
语句(当然稍后再添加 release
它)。您也可以使用- copyFromArray
和return [[myArray objectAtIndex:anIndex] retain];
,并在您完成后续代码时释放它。
是的,只要退回它就安全了。正如 lef2 所说,下次您的代码将控制权返回给运行循环时,自动释放池会被耗尽。只要您返回到调用方法就可以了。以上是关于返回通过 objectAtIndex 从 NSMutableArray 检索到的对象 - 需要自动释放吗?的主要内容,如果未能解决你的问题,请参考以下文章
CVMetalTextureCacheCreateTextureFromImage 总是返回 null
objectAtIndex 没有在 segue 中传递选定的行
我们可以通过使用@try,catch 机制来防止崩溃吗?如果错误是 -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty arra