iOS上的内存保留/泄漏



我有一个从XIB文件定义的UItableViewCell。此单元格包含一个UIScrollView,该视图动态填充UIView对象-viewXY-。我使用arc,在代码的任何地方。UI看起来像:

单元格0:[view00 view01 view02…]

单元格1:[view10view11view12…]

等等。。。,其中[]是可水平滚动的单元格内容。

问题:我对应用程序进行了分析,当我垂直向下滚动时,内存占用迅速增长,据我所见,永远不会恢复正常,也不会达到平稳期。更重要的是,如果我向下滚动几个单元格,然后再向上滚动,内存也会增加。。。。

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

我把问题缩小到创建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(默认标签文本、图像等)。

这些东西快把我逼疯了。

建议我理解我做错了什么是最受欢迎的。

在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;
}

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

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

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

[scrollView addSubview:viewXY];

这是你的问题。你正在向滚动视图中添加一些内容,但永远不会将其删除。

从声音上看,您没有正确使用UITableView。您应该有一个视图控制器,它实现UITableViewDelegate和UITableViewDataSource协议中的方法,并使用这些方法用数据填充表。您从不直接向表中添加任何内容,只在表请求时为其提供单元格。

相关内容

  • 没有找到相关文章

最新更新