如何在使用大量子视图控制器时处理发布?

时间:2012-03-21 21:35:42

标签: objective-c memory-management uiviewcontroller

我在这里有点修复。应用程序搜索Core Data并使用50多个新UIViewController子类在屏幕上显示,这些子类将添加到当前视图中。当新搜索到来时,这些VC将从视图中删除并应该被释放。但是,我没有保留对VC的引用。

我尝试使用保存它们的数组,但这似乎不起作用。我该如何处理这样的事情?

for (UIView *view in scrollView.subviews) {
    [view removeFromSuperview];
}

[gridVCs removeAllObjects];

int numItems = [searchResults count];
int n = 0;

for(Plant *plant in searchResults)
{
    GridViewCellController *gridVC = [[GridViewCellController alloc] initWithNibName:@"GridViewCellController" bundle:nil]; // !!! XXX

   [gridVC setPlant:plant];
   [gridVC setSearchVC:self];
   gridVC.label.text = plant.naamnl;
   [gridVC.imageView setImage:[UIImage imageWithContentsOfFile:foto_url]];

   [scrollView addSubview:gridVC.view];
   [gridVCs addObject:gridVC];

   n++;
}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

我有一个与我正在处理的项目类似的问题,我最终使用UITableView,每次我需要创建一个新的UITableViewCell我会改为创建它的UIViewController,将视图控制器添加到一个数组并设置[ UITableViewCell标签]到数组中视图控制器的索引。如果[UITableView dequeTableViewCell ...]返回了一个UITableViewCell我可以使用我将通过使用[UITableViewCell标签]作为其视图控制器的索引来获取其UIViewController,我的视图控制器有一个方法,所以我可以更改它所代表的数据对象。由于我一次只能看到一个UITableViewCell,(两个在它们之间滚动时)我只需要两个UIViewController。我还使用了一个技巧让UITableView向侧面滚动而不是向上和向下滚动。

答案 1 :(得分:0)

当你调用removeAllObjects时,它会将数组中每个对象的refCount减少到-1,但它仍然是正数。

由于每次创建时都没有释放gridVC,因此会有很多泄漏:

GridViewCellController *gridVC = [[GridViewCellController alloc] initWithNibName:@"GridViewCellController" bundle:nil];
...
[gridVCs addObject:gridVC];
[gridVC release];