NSMutableArray内存管理

chi*_*ken 24 iphone macos cocoa

NSMutableArray *a1 = [[NSMutableArray alloc] init];
NSMutableArray *a2 = [NSMutableArray array];

TempObj *obj = [[TempObj alloc] init]; //assume this line is repeated for each obj
[a1 addObject:obj];
[a1 addObject:obj2];
[a1 addObject:obj3];
[a1 addObject:obj4];

[obj release];
[obj2 release];
[obj3 release];
[obj4 release];

[a1 release];
Run Code Online (Sandbox Code Playgroud)

好的,所以a2是一个autorelease obj,所以我不必在它上面调用release?另外你怎么知道什么时候得到自动释放对象?

对于a1,我不必遍历数组并首先释放每个对象?如果我调用[a1 removeAllObjects]怎么办?这会调用[[a1 objectAtIndex:#] release];

我是否应该在将这些对象添加到阵列后释放它们?

And*_*ndy 45

将对象添加到数组时,它会调用retain该对象.如果你没有释放指向该对象的指针,那将是一个泄漏.当你释放数组时,它会调用release它所拥有的所有对象,因为它retain之前已经调用过.

至于autorelease vs release,唯一可以确定的方法(除了可能阅读文档之外)是通过方法的名称.我相信一般的规则是,如果你没有分配对象,那么你不负责释放它.

关于所述对象创建方法中,所有的方便的方法(array:,arrayWithObjects:,arrayWithArray:等等)返回自动释放物体.然而,其相应的初始化方法(init:,initWithObjects:,initWithArray:,等)不-如果你打电话给他们,你是负责调用release返回的对象.

我似乎在这里回忆一些关于这个主题的其他问题 - 你可以尝试四处寻找更彻底的解释.

  • 这是正确的 - 数组处理所有这些. (4认同)

Chu*_*uck 12

将Objective-C内存管理视为所有权而不是保留释放更容易.将对象添加到数组时,该数组现在是该对象的共同所有者,并负责正确管理内存.当所有者(任何对象包含您发布的代码)调用release对象时,它将放弃所有权,现在该数组是唯一的所有者.

Apple对Cocoa中的所有权如何运作有一个很好的入门(包括你如何知道你何时负责调用release一个对象):Cocoa的内存管理编程指南.如果你想使用Cocoa,这是必读的.