我有一个从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协议中的方法,并使用这些方法用数据填充表。您从不直接向表中添加任何内容,只在表请求时为其提供单元格。