Objective c NSArray objectAtIndex返回的NSString是自动释放还是保留

Objective c NSArray objectAtIndex返回的NSString是自动释放还是保留,objective-c,nsstring,nsarray,retain,autorelease,Objective C,Nsstring,Nsarray,Retain,Autorelease,我有一个从数组返回的字符串,只是想知道在使用它之后是否需要释放它 自动释放 也就是说,对于(几乎?)由方法返回的任何对象,如果不是这样的话,将使内存管理变得过于复杂。这就是为什么我们都喜欢自动释放。自动释放 也就是说,对于(几乎?)由方法返回的任何对象,如果不是这样的话,将使内存管理变得过于复杂。这就是为什么我们都喜欢自动释放。从-objectAtIndex:返回的对象在技术上都是相同的 代码如下所示: -(id) objectAtIndex:(NSUInteger) index {

我有一个从数组返回的字符串,只是想知道在使用它之后是否需要释放它

自动释放

也就是说,对于(几乎?)由方法返回的任何对象,如果不是这样的话,将使内存管理变得过于复杂。这就是为什么我们都喜欢自动释放。

自动释放


也就是说,对于(几乎?)由方法返回的任何对象,如果不是这样的话,将使内存管理变得过于复杂。这就是为什么我们都喜欢自动释放。

-objectAtIndex:
返回的对象在技术上都是相同的

代码如下所示:

 -(id) objectAtIndex:(NSUInteger) index
 { 
      return [[objects_[index] retain] autorelease];
 }

因此它们不属于您,但如果您将其从数组中删除,它将不会立即被释放。

-objectAtIndex:
返回的对象从技术上讲都是

代码如下所示:

 -(id) objectAtIndex:(NSUInteger) index
 { 
      return [[objects_[index] retain] autorelease];
 }

因此,它们不属于您,但如果您将其从阵列中删除,它将不会立即被释放。

请看这篇博文,它很好地总结了Objective C内存管理的规则:

特别是,规则#1适用于这里-您只需要在拥有对象时释放该对象,并且在分配、复制或新建对象(或者明确保留对象)时拥有该对象。你没有做任何这些事情,所以你不需要发布它


它是否自动释放取决于字符串最初是如何创建的,但您不必担心,因为您不负责释放它

看看这篇博文,它很好地总结了Objective C内存管理的规则:

特别是,规则#1适用于这里-您只需要在拥有对象时释放该对象,并且在分配、复制或新建对象(或者明确保留对象)时拥有该对象。你没有做任何这些事情,所以你不需要发布它


它是否自动释放取决于字符串最初是如何创建的,但您不必担心,因为您不负责释放它

有两个例外:
+new
+alloc
、和
-init
,我的头上没有遵循这些规则。是的,但我不想造成任何混乱,你不需要释放由
+new
+alloc
+init
创建的对象,它不一定是自动删除的;调用方根本不知道它的所有权。有两个例外:
+new
+alloc
、和
-init
,我不遵守这些规则。是的,但我不想造成任何混乱,你不需要释放由
+new
+alloc
创建的对象,和
+init
它不一定是自动释放的;调用者根本不知道它的所有权,但事实并非如此,因为objectAtIndex:不保留并自动释放它。你可以很容易地用以下代码检查:@wirrwarr这个答案是在ARC存在之前。由于.Hm的添加/存在,容器的机制(以及ObjC中的返回值)在ARC发布时发生了变化,但我使用手动内存管理对其进行了测试,正如您从我的要点中所看到的。我不认为当引入ARC时,MMM的行为会因为向后兼容性而改变,或者我在这里遗漏了什么?@wirrwarr手动内存管理在最新版本的clang下仍然发出ARC感知指令(不是调用objc_msgSend,而是调用objc_retain、objc_release等)。但这不是真的,as objectAtIndex:不保留+自动释放它。你可以很容易地用以下代码检查:@wirrwarr这个答案是在ARC存在之前。由于.Hm的添加/存在,容器的机制(以及ObjC中的返回值)在ARC发布时发生了变化,但我使用手动内存管理对其进行了测试,正如您从我的要点中所看到的。我不认为当引入ARC时,MMM的行为会因为向后兼容性而改变,或者我在这里遗漏了什么?@wirrwarr手动内存管理在最新版本的clang下仍然发出ARC感知指令(不是调用objc_msgSend,而是调用objc_retain、objc_release等)。