在这两次调用之间,我得到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。
答案 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。我失去了一天!我很惊讶编译器没有捕获它,并且这个方法的第一个版本被调用了。但它就是。
我正在分享这个,以防其他人像我一样懒得打字员陷入同样的陷阱。