表格视图上显示DELETE按钮时的IOS内存错误

时间:2014-03-31 23:10:43

标签: ios iphone objective-c xcode5

使用Table View处理项目时收到内存错误。

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


这是故事板布局:

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的更多信息。

  1. 有没有人经历过类似的事情?
  2. 我应该遵循什么程序来调试此错误?
  3. 是否有Apple程序报告此类错误?

3 个答案:

答案 0 :(得分:0)

删除此行:[tableView reloadData]; - 暗示。

将来你不需要发布Xcode的截图,只是给我们错误。

答案 1 :(得分:0)

请执行以下操作。对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];
    }
}

答案 2 :(得分:0)

这似乎是一个错误。使用Instruments,我发现_canEditRowAtIndexPath:消息被发送到CDUTableViewController的解除分配的实例(通过点击后退按钮从堆栈中弹出)。当表位于UITableViewController而不是UIViewController时,永远不会发送此消息 - 我不知道为什么会这样。

你可以通过使用UITableViewController,或者在CDUViewController中为CDUTableViewController创建一个强大的属性,并推送代码而不是使用segue来解决这个问题(这样你的CDUTableViewController就不会被解除分配了。 POP)。