从 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 的范围'

NSArray objectAtIndex 不工作。请帮忙

*** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds fo

NSArray objectAtIndex 索引 1 超出 [0,0] 的范围?

安全的 NSArray 访问

[__NSArrayM objectAtIndex:]: 索引 2 超出范围 [0 .. 1]'