我有一个从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(默认标签文本,图像等...)。
这些东西让我发疯。
非常欢迎建议了解我做错了什么。
答案 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协议中获取方法,并使用它们来填充表中的数据。您永远不会直接向表中添加任何内容,只在请求时为其提供单元格。