didSelectRowAtIndexPath 中的 NSZombie

Posted

技术标签:

【中文标题】didSelectRowAtIndexPath 中的 NSZombie【英文标题】:NSZombie in didSelectRowAtIndexPath 【发布时间】:2012-03-26 20:54:09 【问题描述】:

我有一个有趣的问题,我似乎无法找出它发生的原因,可能是我忽略了一些小问题。

我有一个 UITableView,在我的 didselectrowatindex 路径中导航到一个新视图,然后导航到下一个视图并弹出两个视图以返回第一个视图,然后应用程序因 EXC_BAD_ACCESS 而崩溃

所以我使用了instruments和NSZombie,在didselectrowatindexpath中找到了一个malloc,但是我不知道为什么

这是我的代码:

if([workflowswithdirectories count] == 0)

    WorkflowViewController *aWorkFlow = [[WorkflowViewController alloc] init];
    MenuObject *obj = [workflownames objectAtIndex:[indexPath row]];
    aWorkFlow.heading = obj.name;
    aWorkFlow.workId = obj.workflowid;
    aWorkFlow.siteId = obj.siteid;
    aWorkFlow.item = obj;
    [self.navigationController pushViewController:aWorkFlow animated:YES];


else if([workflownames count] == 0)

    WorkflowListViewController *work = [[WorkflowListViewController alloc] init];
    work.siteId = self.siteId;
    MenuObject *obj = [workflowswithdirectories objectAtIndex:[indexPath row]];
    work.menu = obj.next;
    work.heading = obj.name;
    [self.navigationController pushViewController:work animated:YES];

else

    if([indexPath section] == 0)
    
        WorkflowListViewController *work = [[WorkflowListViewController alloc] init];
        work.siteId = self.siteId;
        MenuObject *obj = [workflowswithdirectories objectAtIndex:[indexPath row]];
        work.menu = obj.next;
        work.heading = obj.name;
        [self.navigationController pushViewController:work animated:YES];
    
    else
    
        WorkflowViewController *aWorkFlow = [[WorkflowViewController alloc] init];
        MenuObject *obj = [workflownames objectAtIndex:[indexPath row]];
        aWorkFlow.heading = obj.name;
        aWorkFlow.workId = obj.workflowid;
        aWorkFlow.siteId = obj.siteid;
        aWorkFlow.item = obj;
        [self.navigationController pushViewController:aWorkFlow animated:YES];  //Malloc is on this line
    
  
[tableView deselectRowAtIndexPath:indexPath animated:YES];

编辑:

我忘了提到的是,在某些情况下,我将同一类的另一个推送到导航控制器上,但只有在转到 WorkflowViewController 然后到下一个视图控制器然后返回两次时才会抛出异常

【问题讨论】:

如果你让你的新 ViewController 成为一个强属性而不是一个方法 iVar。这样可以保证它不会过早发布。 EXC_BAD_ACCESS 错误发生在您尝试访问已释放的对象时。您应该在用于弹回原始视图的方法上发布代码 sn-p。您提到您正在推动至少另一种观点。也许您正在那里释放有问题的对象? 你能告诉我们 didSelectRowAtIndexPath 方法吗?只需粘贴您的整个回溯。要了解有关错误的更多信息,请使用终端的 malloc_history。 @JustinXXVII,他好像在使用 ARC。 【参考方案1】:

为了内存和效率,让所有 UIViewControllers 强属性(带有支持 iVar)以保证它们保持足够长的时间来做任何有用的事情。

【讨论】:

以上是关于didSelectRowAtIndexPath 中的 NSZombie的主要内容,如果未能解决你的问题,请参考以下文章

我可以麻烦UITableViewDelegate的didSelectRowAtIndexPath:吗?

在 didSelectRowAtIndexPath 之后 prepareForSegue?

didSelectRowAtIndexPath 没有被调用?

didSelectRowAtIndexPath 不会在 ViewController 中触发

在 didSelectRowAtIndexPath 中记录特定行

为啥要在 didSelectRowAtIndexPath 中重新定义 pListPath?