如何防止多次快速点击 UITableView 的编辑按钮导致应用程序崩溃?

Posted

技术标签:

【中文标题】如何防止多次快速点击 UITableView 的编辑按钮导致应用程序崩溃?【英文标题】:How do I prevent quickly tapping the Edit button for a UITableView multiple times from crashing the application? 【发布时间】:2010-11-08 19:36:59 【问题描述】:

我有一个子类UITableViewController,它在进入编辑模式时执行一些动画,即从导航栏中删除UIBarButtonSystemItemAdd,并使表格的第一行不存在动画,然后在编辑模式时返回已退出:

- (void) setEditing: (BOOL) editing animated: (BOOL) animated

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow: 0 inSection: 0];

    if (editing)
    
        [self removeAddButton];
        [datasource removeObjectAtIndex: 0];
        [tableView deleteRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationTop];
    
    else
    
        [self restoreAddButton];
        [datasource insertObject: @"First Row" atIndex: 0];
        [tableView insertRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationTop];
    

    [indexPath release];
    [super setEditing: editing animated: animated];

问题是,当多次点击编辑按钮太快,动画还没有完成时,应用程序崩溃:

AppName(1824,0xa0ae5500) malloc: *** error for object 0x5f503a0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

很明显,某些动画进出动画没有足够的时间完成,那么,我该如何解决这个问题?我在做一些不必要/错误的事情吗?

【问题讨论】:

【参考方案1】:

其实这是一个简单的内存管理错误。

删除这一行:

[indexPath release];

原因?这一行:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow: 0 inSection: 0];

这会返回一个有效保留计数为 0 的 NSIndexPath。您不需要释放它。

对于任何类型的内存释放错误,您都应该打开 NSZombieEnabled 再次运行。它会给你一个更完整的错误信息。

您还应该养成使用构建和分析的习惯;它可能会标记这个。

【讨论】:

我可以请你喝啤酒吗?非常感谢你。 :) 不客气。至于啤酒,我会告诉你我告诉大家的:如果我们在开发者大会上见面,将会有双向购买的啤酒,直到我们都不记得我们的名字。 :) 注意:更新了提到构建和分析的答案。

以上是关于如何防止多次快速点击 UITableView 的编辑按钮导致应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章

防止用户快速多次点击按钮,响应事件响应多次

防止快速连续点击button多次执行相同操作

Android 如何判断多次点击

Android防止按钮快速重复点击

微信小程序:防止多次点击跳转(函数节流)

UITableView 中需要多次点击以进行复选标记