iOS上的内存保留/泄漏

时间:2013-02-23 22:29:50

标签: ios memory xcode4.5 nib

我有一个从XIB文件定义的UItableViewCell。这个单元格包含一个UIScrollView,它随UIView对象一起填充 - viewXY - 。我在代码中到处使用arc。用户界面如下:

单元格0:[view00 view01 view02 ...]

单元格1:[view10 view11 view12 ...]

etc ...,其中[]是一个可水平滚动的单元格内容。

问题:我描述了应用程序,当我垂直向下滚动时,内存占用空间迅速增长,据我所知,永远不会恢复正常,也不会达到稳定状态。更重要的是,如果我向下滚动几个单元格然后再向上,内存也会增加....

我用仪器工具检查了泄漏,没有。

我缩小了创建viewXY的代码部分的问题。如果我使用:

myDisplay* viewXY;//myDisplay is a UIView subclass
-->viewXY = [[NSBundle mainBundle] loadNibNamed:AW_UI_VE owner:self options:nil][0];
[scrollView addSubview:viewXY];

当我翻阅细胞时,记忆力会失去控制。 NIB是一个简单的UIView + UIImageView + 2标签....如果我替换说

UIImageView *viewXY = [UIImageView alloc] initWithImage:[blablabla]]
[scrollView addSubview:viewXY];

一切都很好。仪器中的 Live Bytes 迅速达到稳定状态。

作为测试的一部分,我加载NIB文件而不执行其自定义类中定义的任何方法,因此它提供了IB中定义的IBOutlets(默认标签文本,图像等...)。

这些东西让我发疯。

非常欢迎建议了解我做错了什么。

3 个答案:

答案 0 :(得分:1)

在ViewController的viewDidLoad中你应该有这样的东西:

 [yourTable registerNib:[UINib nibWithNibName:@"yourUITableViewCellNibName" bundle:nil]
 forCellReuseIdentifier:@"reuseIdentifier"];

并在您的表数据源方法(cellForRowAtIndexPath)中,您应该具有以下内容:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     MyCustomCell* cell = [tableView dequeueReusableCellWithIdentifier:@"reuseIdentifier"];
     //Set your cell's values.

return cell;
}

答案 1 :(得分:0)

我不确定这是否与内存使用情况有关,但文档建议UINib用于此用例:

  

只要需要重复实例化相同的nib数据,您的应用程序就应该使用UINib个对象。

另一种可能性是myDisplay中存在保留周期。它是否具有strong的任何weak属性?

答案 2 :(得分:0)

[scrollView addSubview:viewXY];

有你的问题。您正在向滚动视图添加内容,并且永远不会将其删除。

从事物的声音来看,你没有正确使用UITableView。你应该有一个视图控制器,它可以从UITableViewDelegate和UITableViewDataSource协议中获取方法,并使用它们来填充表中的数据。您永远不会直接向表中添加任何内容,只在请求时为其提供单元格。