我有UITableView
个带有附件视图的单元格。为了提高滚动性能,我已将附件视图声明为静态。例如,在我的tableView:cellForRowAtIndexPath:
NSString* identifier = @"Identifier";
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if(!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.detailTextLabel.text = @"";
cell.accessoryView = nil;
switch (indexPath.row) {
case 0: {
static UISegmentedControl* control;
if(!control) {
control = [[UISegmentedControl alloc] initWithItems:@[...];
}
[control removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];
// ...
// setup
// ...
break;
}
case 1: {
static UISegmentedControl* control;
if(!control) {
control = [[UISegmentedControl alloc] initWithItems:@[...]];
}
[control removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];
// ...
// setup
// ...
break;
}
case 2: {
static UISwitch* s;
if(!s) {
s = [[UISwitch alloc] init];
}
[s removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];
// ...
// setup
// ...
break;
}
case 3: {
static UISwitch* s;
if(!s) {
s = [[UISwitch alloc] init];
}
[s removeTarget:nil action:NULL forControlEvents:UIControlEventAllEvents];
// ...
// setup
// ...
break;
}
}
等等。该表有4个与此类似的部分。在其中一个中,更改控件的值需要更新其他单元格,这可以通过调用-reloadRowsAtIndexPaths:withRowAnimation
来完成。
如果快速切换开关/控件,那么一切都很好除了,此时应用程序会冻结(但不会崩溃)。然后,应用程序在调试器中显示高CPU使用率和高能量影响,并在20秒左右后最终关闭。
我发现如果我只是从声明中删除静态关键字(以便每次都重新分配视图),这种崩溃就不会发生,但是滚动性能有点不稳定,我这样做了。我想避免。
有趣的是,用-reloadSections:withRowAnimation
重新加载单元格会立即导致冻结(在第一个切换上)。
使用-reloadData
重新加载整个表格毫无问题。这可能表明表格视图的内部动画存在一些问题。
为什么在单元格快速重载(或立即使用-reloadSections:
)时使用静态附件视图会导致崩溃?