2009-01-19 63 views
24
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]; 

好的,所以a2是一个autorelease obj所以我不必打电话发布呢?你怎么知道你什么时候得到一个autorelease对象?NSMutableArray内存管理

而对于a1,我不必循环遍历数组并首先释放每个对象?如果我打电话给[a1 removeAllObjects];是否调用[[a1 objectAtIndex:#] release];

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

回答

45

将对象添加到数组时,它会在该对象上调用retain。如果你不释放指向该对象的指针,它将是一个泄漏。当释放数组时,它将在其所有的对象上调用release,因为它以前称为retain

至于autorelease vs release,肯定知道的唯一方法(除了可能读取文档)是由方法的名称。我相信一般的规则是,如果你没有分配对象,那么你不负责释放它。

关于对象创建方法,所有的便利方法(array:,arrayWithObjects:arrayWithArray:等)都会返回自动释放的对象。但是,它们的相应init方法(init:initWithObjects:,initWithArray:等)不会 - 如果您调用它们,则负责在返回的对象上调用release

我似乎还记得关于此主题的其他一些问题 - 您可以尝试四处搜索以获得更全面的解释。

+0

因此,通过所有对象进行循环并释放1乘1而不是调用数组本身释放是错误的。 – chicken 2009-01-19 01:00:32

+4

这是正确的 - 数组处理所有为你。 – Andy 2009-01-19 02:30:09

12

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

苹果对Cocoa所有权的工作方式有一个很好的入门知识(包括如何知道何时你负责在对象上调用release):Memory Management Programming Guide For Cocoa。如果你想使用可可,这是必读。

0

要记住的基本原理是:您必须在每次调用“init”,“retain”或“copy”时调用相应的“release”或“autorelease”调用。这就是你需要知道的全部内容。

在您的示例中,a1调用了“init”,因此您需要在其上放置一个“发布”。与“obj”同上。你没有在其他任何地方调用“init”,“retain”或“copy”,所以你不需要在其他任何地方调用“release”或“autorelease”。

0

我不知道无论是IM对错

NSMutableArray *a1 = [[NSMutableArray alloc] init]; // will be autorelease 
NSMutableArray *a1 = [NSMutableArray alloc]; // will not autorelease 

后您[a1 removeAllObjects];

0

您发布的OBJ,OBJ 2,OBJ 3,OBJ4只是将它们添加到阵列(最好方式)之后。否则,你必须循环并释放每个对象(这是愚蠢的方式:我迄今为止所做的一个)。