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 是一个自动释放对象,所以我不必在它上面调用释放?另外你怎么知道你什么时候得到一个自动释放对象?
对于 a1,我不必循环遍历数组并首先释放每个对象?如果我调用 [a1 removeAllObjects]; 会怎样?是否调用 [[a1 objectAtIndex:#] release];
将这些对象添加到数组后,我是否应该释放它们?
最佳答案
当您将对象添加到数组时,它会对该对象调用retain
。如果您不释放指向该对象的指针,则会发生泄漏。当您释放数组时,它将对其保存的所有对象调用 release
,因为它之前调用了 retain
。
对于自动释放与释放,唯一可以确定的方法(除了可能阅读文档之外)是通过方法的名称。我认为一般规则是,如果您没有分配该对象,那么您不负责释放它。
关于对象创建方法,所有便捷方法(array:
、arrayWithObjects:
、arrayWithArray:
等)都返回 autoreleased对象。但是,它们相应的 init 方法(init:
、initWithObjects:
、initWithArray:
等)不会 - 如果您调用它们,那么您就是负责对返回的对象调用release
。
我似乎在这里记忆起有关此主题的其他一些问题 - 您可以尝试四处搜索以获取更全面的解释。
关于iphone - NSMutableArray 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456233/