“删除”按钮显示在表视图上时出现IOS内存错误

“删除”按钮显示在表视图上时出现IOS内存错误,ios,iphone,objective-c,xcode5,Ios,Iphone,Objective C,Xcode5,我在使用表视图处理项目时收到内存错误 我在一个新项目中复制了故事板,并收到了相同的错误 这是故事板布局: 如果在显示删除按钮的同时按下“后退”按钮,则会出现如下内存错误: 用于删除的代码为: - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { // Return NO if you do not want the specified item to

我在使用表视图处理项目时收到内存错误

我在一个新项目中复制了故事板,并收到了相同的错误


这是故事板布局:

如果在显示删除按钮的同时按下“后退”按钮,则会出现如下内存错误:


用于删除的代码为:

- (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的信息

  • 有没有人经历过类似的事情
  • 我应该遵循什么过程来调试此错误
  • 苹果公司是否有报告此类错误的程序

  • 删除此行:
    [tableView reloadData]-其含义


    将来您不需要发布Xcode的截图,只要告诉我们错误就可以了。

    请执行以下操作。为ivar使用现代属性,在实现中删除大括号中的声明,并在类中的任何地方将该属性引用为self.tableData。见以下评论:

    // 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];
        }
    }
    

    这似乎是一个bug。使用工具,我发现一个_canEditRowAtIndexPath:消息被发送到CDUTableViewController的一个已解除分配的实例(在点击后退按钮将其弹出堆栈之后)。当表位于UITableViewController而不是UIViewController中时,不会发送此消息——我不知道为什么会这样


    您可以通过使用UITableViewController或在CDUViewController中为CDUTableViewController创建一个强属性,并推入代码而不是使用segue(这样您的CDUTableViewController就不会在pop上解除分配)来绕过此问题

    我在我的一个项目中尝试过这个,但没有得到任何错误。你能把这个新项目发布到某个地方让我们下载吗?谢谢rdelmar。这是项目;[链接]dtrotzjr,感谢您的及时回复和反馈。删除该行显然不能解决问题。我已经在OP的项目中对此进行了测试,但它不能解决问题。我只看到UIViewController中的表视图存在此问题。当我在使用UITableViewController的项目中执行此操作时,不会出现错误。不知道为什么,但在弹出(并解除分配)后会向控制器发送一条消息。很有趣。现在对我来说还不错。“也许我需要做更多的测试。”@rdelmar。请试试我做的这个(为在3.5英寸sim卡上运行7.1而构建),它会像OP一样崩溃(将手机向左滑动,然后按“后退”而不按“删除”按钮)。我确认。但是第二次尝试后它崩溃了。谢谢你的帮助。我尝试了UITableViewController选项,它工作正常。起初,我没有创建表视图控制器,因为我在IB中关联自定义类时遇到了问题,但肯定是这样。