从 NSArray objectAtIndex 返回的 NSString 是自动释放还是保留
Posted
技术标签:
【中文标题】从 NSArray objectAtIndex 返回的 NSString 是自动释放还是保留【英文标题】:Does the NSString returned from NSArray objectAtIndex as autorelease or retain 【发布时间】:2011-12-06 18:04:23 【问题描述】:我有一个从数组返回的字符串,只是想知道是否需要在使用后释放它。
【问题讨论】:
【参考方案1】:看看这篇博文,它很好地总结了 Objective C 内存管理的规则:http://interfacelab.com/objective-c-memory-management-for-lazy-people/。
特别是,规则 #1 在这里适用 - 如果你拥有一个对象,你只需要释放它,如果你分配、复制或新建它(或者如果你明确地保留它),你就拥有它。你没有做任何这些事情,所以你不需要释放它。
是否自动释放取决于字符串最初是如何创建的,但您不必担心,因为您不负责释放它。
【讨论】:
【参考方案2】:从-objectAtIndex:
返回的对象在技术上是两者。
代码如下所示:
-(id) objectAtIndex:(NSUInteger) index
return [[objects_[index] retain] autorelease];
所以它们不属于你,但如果你从数组中删除它,它不会立即被释放。
【讨论】:
但这不是真的,因为 objectAtIndex: 不会保留+自动释放它。您可以使用以下代码轻松检查:gist.github.com/mkramskoy/f94755191b758fe430b3a777ea07932d @wirrwarr 这个答案是在 ARC 存在之前。由于 objc_retainAutoreleasedReturnValue 的添加/存在,容器的机制(以及一般 ObjC 中的返回值)在 ARC 发布时发生了变化。 嗯,但我通过手动内存管理对其进行了测试,正如您从我的要点中看到的那样。我认为 MMM 行为不会因为向后兼容性而在引入 ARC 时发生变化,或者我在这里遗漏了什么? @wirrwarr 在最新版本的 clang 下手动内存管理仍然发出 arc-aware 指令(不是调用 objc_msgSend,而是调用 objc_retain、objc_release 等)。【参考方案3】:自动释放。
这与(几乎?)方法返回的任何对象一样,如果不是,它会使内存管理过于复杂。这就是我们都喜欢自动释放的原因。
【讨论】:
一些例外情况:+new
、+alloc
和 -init
我的头脑中没有遵守这些规则。
是的,但我不想引起任何混淆,即您不需要释放由+new
、+alloc
和+init
创建的对象
不一定是自动发布的;它根本不属于调用者。以上是关于从 NSArray objectAtIndex 返回的 NSString 是自动释放还是保留的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3:UITabBarController 错误:'*** -[__NSArray0 objectAtIndex:]:索引 1 超出了空 NSArray 的范围'
*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds fo