UITableView与静态附件视图崩溃

时间:2016-08-28 15:10:45

标签: ios objective-c uitableview static

背景

我有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:)时使用静态附件视图会导致崩溃?

0 个答案:

没有答案