2012-02-20 79 views
0

我的程序向屏幕添加了不确定数量的视图(由用户在运行时确定),并通过将这些视图存储在数组中来跟踪这些视图。正确的方式释放存储在NSMutableArray中的视图?

在我的视图控制器

for (NSString *equationText in equationData) { 

// creates a FormulaLabel object for every object in the equationData mutable array 

FormulaLabel *tempLabel = [[FormulaLabel alloc] initWithFrame:CGRectMake(frame)]; 
[view addSubview:tempLabel]; 
[balanceItems addObject:tempLabel]; //balance items keeps track of all the views 

当我更新我的数据,我需要在屏幕上意见不同的安排,所以我想反映一个数据的变化将删除所有意见的最快方法目前在屏幕上并从更新的数据添加新视图。

对于这种方法,(据我所知)我需要从上海华删除的意见,释放他们,并删除存储在balanceItems的对象。然后我需要初始化新视图,将它们添加到子视图中,并将它们添加到数组中。但是,下面的代码会生成一个错误。

for (UIView *view in balanceItems) { 

    [view removeFromSuperview]; 
    [view release]; 
} 

[balanceItems removeAllObjects]; 

什么是正确的方式从超视图以及数组中删除视图?

+0

你得到的错误是什么?在哪一行? – sch 2012-02-20 19:58:55

+0

@sch'[balanceItems removeAllObjects]' – Mahir 2012-02-20 20:03:10

+0

它没有给出具体的错误,它只是表示访问不好 – Mahir 2012-02-20 20:03:44

回答

0

首先,你应该创建它们时正确释放的观点:

FormulaLabel *tempLabel = [[FormulaLabel alloc] initWithFrame:CGRectMake(frame)]; // retain count is 1 
[view addSubview:tempLabel]; // retain count is 2 
[balanceItems addObject:tempLabel]; // retain count is 3 
[tempLabel relase]; // retain count is 2 

您应该释放tempLabel,因为你有init方法获得它,所以你拥有它。

然后,当您删除视图;你不必调用释放:

for (UIView *view in balanceItems) { 
    [view removeFromSuperview]; // retain count is 1 
} 
[balanceItems removeAllObjects]; // retain count is 0 => view gets deallocated 

因为视图目前只保留了,但超级视图和阵列,所以当你从他们删除它,它就会被释放。

+0

数组是否自己创建视图副本? – Mahir 2012-02-20 20:20:54

+0

它不会创建新副本,它只是保留视图。 – sch 2012-02-20 20:23:25