如何完全释放可变数组然后再次分配

use*_*612 1 iphone memory-management

我有一个表视图,可变数组指针itemList保存其单元格的对象.我分配并初始化可变数组,

itemList = [[NSMutableArray alloc] init];

并将对象添加到数组中并加载表视图.

现在我需要释放整个数组并再次分配以保存要在表视图中显示的新对象数组.这就是我在做的事情

if(self.itemList!= nil){[self.itemList removeAllObjects]; [self.itemList release];

}

self.itemList = [[NSMutableArray alloc] init];

然后将对象添加到数组中以在表视图中显示.

我正在调用[tableview reloadData];

表格加载正确,但在此之后发生三到四次我的应用程序崩溃

现在,1.当我在分配后调用保留计数时,它显示2 y?2.我的应用程序崩溃一段时间后出现错误"iphone Program received signal:"0".警告:check_safe_call:无法恢复当前帧"

我怀疑itemList没有被正确释放.

有人可以指导我吗?

con*_*are 5

好的很多东西在这里:

1)self.itemList =既然你有这个,我假设你正在使用属性.如果你的@property设置为retain,则调用self.itemList = xxx与itemList = xxx有很大不同.您会看到,当您使用self.itemList赋值时,您已经在itemList中已经为您自动释放了所有内容,并保留了新的内容.所以用这一行:

self.itemList = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)

你实际上保留了两次,而这一行:

itemList = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)

你只保留一次.使用属性是进行内存管理的简单方便的方法,但在这种情况下您只需要:

self.itemList = [NSMutableArray array]; //returns an autoreleased array that is then retained by the self.
Run Code Online (Sandbox Code Playgroud)

然后,您只需要在dealloc方法中进行单个释放调用即可进行清理

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

2)当一个项目被添加到一个数组时,它会被数组保留,所以你可以在文字之后立即释放它

Foo *f = [[Foo alloc] init];
[itemList addObject:f];
[f release];
Run Code Online (Sandbox Code Playgroud)

当阵列被释放后,它将向其所有成员发送一条释放消息,因此您不必担心这一点.

3)我不确定你的崩溃,但尝试使用调试器逐步查找崩溃的位置.它似乎与您拥有的内存管理无关.您可以在此站点中搜索有关调试和查找内存错误源的许多问题,包括我最喜欢的NSZombieEnabled