如何防止多次快速点击 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 的编辑按钮导致应用程序崩溃?的主要内容,如果未能解决你的问题,请参考以下文章