在Objective C中取消分配对象数组的正确方法

时间:2011-07-31 19:12:42

标签: objective-c memory-management

我是Objective-C的新手,仍然没有完全掌握内存管理。我有一个NSMutableArray指针......

NSMutableArray *itemArray;

在整个程序中,我都会添加项目。

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
//end loop

有一点我想要抛出数组中的所有项目并重新填充它。我只是循环遍历整个数组并向我的直觉告诉我发送一个释放消息到数组中的每个对象,然后removeAllObjects,或者removeAllObjects是否负责减少所有引用计数?以下是否正确?

//start loop
[[itemArray objectAtIndex:i] release];
//end loop
[itemArray removeAllObjects];

3 个答案:

答案 0 :(得分:5)

你遇到的真正问题是:

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
//end loop

您正在分配一个对象(因此您拥有所有权),然后将其粘贴在数组中并且永远不会释放它。你应该这样做:

//start loop    
MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
[x release];
//end loop

或者这个:

//start loop    
MyItem *x = [[[MyItem alloc] init] autorelease];
[itemArray addObject:x];
//end loop

将数据添加到数组后,数组将通过保留对象来获取所有权,因此您不必自己保留它。当您调用-removeAllObjects时,数组将根据需要释放它们。基本上,一旦你把它交给阵列,你就不用担心了。

<强制性ARC插件>

你应该开始习惯使用ARC,你根本不必担心释放对象,因为编译器会为你做这件事。

答案 1 :(得分:2)

只需致电-removeAllObjects即可。添加到NSArray的对象由阵列保留,并在删除时释放。

请注意,如果您使用+alloc创建对象,则还必须使用匹配的-release-autorelease将其释放。在创建对象时似乎没有。之一:

MyItem *x = [[[MyItem alloc] init] autorelease];
[itemArray addObject:x];

MyItem *x = [[MyItem alloc] init];
[itemArray addObject:x];
[x release];

会奏效。

答案 2 :(得分:1)

NSArrays上的'add'方法组会保留您传入的对象,并且删除'group'方法会释放它们,因此您可以使用第二种方法。实际上你的第一个方法(向每个对象发送释放然后调用removeAllObjects)很可能会导致抛出BAD_EXEC_ACCESS异常。