IOS 内存错误,而 DELETE 按钮显示在表视图上
Posted
技术标签:
【中文标题】IOS 内存错误,而 DELETE 按钮显示在表视图上【英文标题】:IOS memory error while DELETE button is shown on Table View 【发布时间】:2014-03-31 23:10:43 【问题描述】:我在使用表视图处理项目时收到内存错误。
我在一个新项目上复制了情节提要并收到了同样的错误。
故事板布局如下:
01 - The Storyboard
如果在显示删除按钮时按下“返回”按钮,则会出现如下内存错误:
02 - Running app and Memory error
用于删除的代码是:
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
// Return NO if you do not want the specified item to be editable.
return YES;
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
// Remove the row from data model
[tableData removeObjectAtIndex:indexPath.row];
// Request table view to reload
[tableView reloadData];
我发布此问题是为了了解有关 Xcode 和 Objective-C 的更多信息。
-
有没有人经历过类似的事情?
我应该遵循什么过程来调试这个错误?
是否有 Apple 程序可以报告此类错误?
【问题讨论】:
我在我的一个项目中尝试过这个,我没有收到任何错误。您可以将新项目发布到某个地方供我们下载吗? 感谢 rdelmar。这是项目; [链接]ge.tt/1kmyMSV1/v/0?c 【参考方案1】:这似乎是一个错误。使用 Instruments,我发现 _canEditRowAtIndexPath: 消息被发送到 CDUTableViewController 的已释放实例(在通过点击后退按钮从堆栈中弹出之后)。当表在 UITableViewController 而不是 UIViewController 中时,永远不会发送此消息——我不知道为什么会这样。
您可以通过使用 UITableViewController 或通过在 CDUViewController 中为 CDUTableViewController 创建一个强属性并推送代码而不是使用 segue 来解决此问题(这样您的 CDUTableViewController 不会在弹出时释放) .
【讨论】:
rdelmar 感谢您的帮助。我试过 UITableViewController 选项,它工作正常。最初我没有创建表视图控制器,因为我在 IB 中关联自定义类时遇到了麻烦,但绝对是这样。【参考方案2】:删除此行:[tableView reloadData];
- 隐含的。
而且以后您不需要发布 Xcode 的屏幕截图,只需将错误信息告诉我们即可。
【讨论】:
dtrotzjr,感谢您的及时回复和反馈。删除线显然不能解决问题。【参考方案3】:请执行以下操作。为您的 ivar 使用现代属性,在实现中删除花括号中的声明,并在类中的任何地方将该属性称为 self.tableData。见内的cmets:
// 1) add a private interface
@interface CDUTableViewController ()
@property(strong, nonatomic) NSMutableArray *tableData;
@end
@implementation CDUTableViewController
// 2) delete the declaration in braces here
- (void)viewDidLoad
[super viewDidLoad];
// 3) refer to self.tableData everywhere in this class
self.tableData = [NSMutableArray arrayWithObjects:@"Egg Benedict", // ...
重大修复出现在删除时。删除后更新您的表以匹配您的模型。仅对删除编辑样式执行此操作:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
if (editingStyle == UITableViewCellEditingStyleDelete)
[self.tableData removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
【讨论】:
我已经在 OP 的项目中对此进行了测试,但它并没有解决问题。我只在 UIViewController 中的表视图中看到这个问题。当我在我的项目中使用 UITableViewController 执行此操作时,我没有收到错误消息。不知道为什么,但是在弹出(并解除分配)后会向控制器发送一条消息。 有趣。现在对我来说运行得很好。也许我需要测试更多。 @rdelmar。请试试这个ge.tt/5CeTqSV1/v/0(专为在 3.5 英寸 sim 上运行的 7.1 构建) 我做到了,它就像 OP 一样崩溃(在向左滑动单元格,然后按“返回”而不按“删除”按钮)。 我确认。但在第二次尝试后它崩溃了。以上是关于IOS 内存错误,而 DELETE 按钮显示在表视图上的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 如果仅在设备上运行,我的应用程序会因内存错误而崩溃
如何在iOS中显示大按钮而不单击按钮(单击该按钮周围的区域)