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 应用程序

如何在iOS中显示大按钮而不单击按钮(单击该按钮周围的区域)

iOS - 只显示后退按钮而不显示导航栏的正确方法是啥?

IOS 9远程通知中的滑动按钮 - 当应用程序在后台而不是在应用程序内存不足时工作

Ios Swift3:lazy var fetchrequestcontroller 显示错误