2

在这两个调用之间的某个地方,我得到 EXC_BAD_ACCESS(代码=2,地址=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 还是很陌生,所以我会很感激在这个环境中建议的调试策略。

蒂亚。

4

2 回答 2

0

好吧 - 我找到了罪魁祸首,正如@dasblinkenlight 建议的那样,它在崩溃的上游。它不是分配给指针的 int ......而且它一定是一个足够奇怪的访问问题类型,僵尸无法捕捉到它。

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

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

最初 selectedDiv 被声明为

DivisionDef * selectedDiv

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

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

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

presto magico,访问冲突消失了!

当我学习苹果在线文档的“声明的属性”一章时,这个想法让我印象深刻,它解释了@synthesize 语句生成的setter 方法负责遵守@protocol 中定义的内存管理属性陈述。

我觉得有趣的是,无论是什么语言,内存管理课程似乎总是很难学习!谢谢大家的建议,感谢支持。

于 2013-05-20T13:33:09.240 回答
0

直到第二天,他们才让人们接受自己对自己问题的回答,这是一件好事。事实证明,虽然可能是一个声音变化,但初始化的变化实际上并不是罪魁祸首。如果我接受了@jonathan 和@verbumdei 的建议,其他人可能已经发现了这一点。

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

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

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

而是尝试了这个:

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

令人惊讶的是,一点点返回值可以带来的不同。啊啊啊啊啊。我为此损失了一天!我很惊讶编译器没有捕捉到它,并且这个方法的第一个版本被调用了。但它就在那里。

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

于 2013-05-20T14:27:14.320 回答