willSelectRowAtIndexPath和prepareForSegue之间会发生什么?需要调试建议

时间:2013-05-20 01:14:43

标签: ios xcode debugging uitableview

在这两次调用之间,我得到EXC_BAD_ACCESS(Code = 2,address = 0xa)。

糟糕访问的常见解释是访问已发布的对象 - 我已经使用NSZombies编译并且没有产生任何结果。我看到一个引用为指针分配一个整数...我可能已经做过了,除了我已经阅读了自今天早上(当程序工作时)我所做的所有更改并且没有找到任何内容。

堆栈框架列出:

- 0 objc_msgsend ... this is where the access violation occurs
- 1 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:]
- 2 -[UITableView _userSelectRowAtPendingSelectionIndexPath:]
...

这些uitableview方法都不公开,所以我无法覆盖它们以查看可能发生的情况。

虽然我是一名经验丰富的开发人员,但我对Xcode和objective-c都很陌生,所以我希望在这种环境下建议调试策略。

TIA。

2 个答案:

答案 0 :(得分:0)

嗯 - 我找到了罪魁祸首,正如@dasblinkenlight建议的那样,它是崩溃的上游。它不是一个分配给指针的int ......它必须是一个奇怪的访问问题类型,僵尸无法捕获它。

令人反感的代码在我的表视图控制器中,并在prepareForSegue中从其呈现的视图控制器调用:

- (void) initWithDiv: (DivisionDef *) selectedDivision
{
    selectedDiv = selectedDivision;
}

最初选择的Div被声明为

DivisionDef * selectedDiv

在实现中,因为我认为它是私有的,只能通过initWithDiv方法访问。即使我后来将其更改为属性(强大,非原子),程序仍然崩溃。当我从

中更改呈现视图控制器中的行时
    [(SelectDetailController *)segue.destinationViewController initWithDiv:selectedDivision];

    [(SelectDetailController *)segue.destinationViewController setSelectedDiv:selectedDivision];

presto magico,访问冲突消失了!

当我研究apple的在线文档的“声明的属性”章节时,这个想法让我感到震惊,并且它解释了@synthesize语句生成的setter方法负责遵守在中定义的内存管理属性。 @protocol语句。

我觉得有趣的是,无论语言是什么,记忆管理课程似乎总是以艰难的方式学习!感谢大家的建议,感谢您的支持。

答案 1 :(得分:0)

在第二天之前,他们不会让自己的问题接受自己的问题,这是件好事。事实证明,虽然可能是一个合理的变化,但初始化的变化实际上并不是罪魁祸首。如果我选择@jonathan& @ verbumdei的建议,其他人可能已经发现了这一点。

当我注释掉willSelectRowAtIndex时,一切正常。咦?

- (void)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

生成的模板代码提供了一个方法didSelectRowAtIndexPath,我只需将其重命名为willSelectRowAtIndexPath。 D'哦!

尝试了这个:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

令人惊讶的是,一个小的回报值可以做出的差异。 AAARRRGGGHHH。我失去了一天!我很惊讶编译器没有捕获它,并且这个方法的第一个版本被调用了。但它就是。

我正在分享这个,以防其他人像我一样懒得打字员陷入同样的​​陷阱。