【问题标题】:EXC_BAD_ACCESS message sent to deallocated instance, but I'm using ARC?EXC_BAD_ACCESS 消息发送到已释放的实例,但我使用的是 ARC?
【发布时间】:2011-12-17 22:03:38
【问题描述】:

我有一个从 SOAP Web 服务获取信息的应用程序,我想在 UITableView 中显示结果。

我有这个应用程序的早期版本,我正在创建一个新版本来清理并删除一堆已弃用且不再使用的遗留代码。

在以前的版本中,这运行良好。在新版本中,没有那么多。

基本上,当前的场景是返回 3 个字符串,我试图将它们用作 UITableView 中数据的基础。

我正在努力解决这个问题,因为很难找到 EXC_BAD_ACCESS 错误!

(顺便说一句,如果有人有办法让调试体验更像 Visual Studio,我很想听听!不知道是哪一行导致了错误,而且无法在崩溃时查看我的局部变量,看看是什么。我已经在异常断点中添加了,但这似乎没有多大作用。)

无论如何,导致错误出现的行是:

return [[self Libraries] count];

它出现在tableView:numberOfRowsInSection:

我得到的错误消息出现在引用应该存储在NSMutableArray[self Libraries] 中的字符串。

这是怎么回事?
我正在使用 ARC,所以不应该正确处理我的所有内存管理吗?
我的代码中没有任何手动发布声明!

请帮我解决这个问题!

【问题讨论】:

  • ARC 仅简化内存管理。它不会完全接管你。
  • 男孩,这是一个无益的评论。这甚至如何指向我解决我的问题?基本上,我的问题是:当我的代码中的release 语句绝对为零时,我怎么能过度发布某些东西?谢谢!
  • @Jonathan Grynspan:真的吗?这不是真的!!!例如,使用 ARC,retain、release、autorelease 甚至 retainCount 都被编译器禁止!我了解内存管理。我知道这些陈述应该去哪里。正如您在下面的帖子中看到的那样,事实证明我的代码很好,这是一个 Xcode 4.2 beta 错误。我认为您不太了解 ARC。
  • @JonathanGrynspan 那你为什么会说“它不会完全接管你”?实际上,这正是它的作用。它专门这样做,旨在使内存管理自动化。为此,它专门禁止手动内存管理。相对于传统的内存管理,这到底留下了什么?
  • @JonathanGrynspan 回答“我不会谈论那个”会让您看起来没有真正的答案。我的问题仍然存在:使用 ARC 时留下了哪些传统的手动内存管理?答:没有!它专门让你远离。

标签: objective-c memory exc-bad-access automatic-ref-counting


【解决方案1】:

在调试器中设置NSZombieEnabledMallocStackLoggingguard malloc。然后,当您的应用程序崩溃时,在 gdb 控制台中输入以下内容:

(gdb) info malloc-history 0x543216

0x543216 替换为导致崩溃的对象的地址,您将获得更有用的堆栈跟踪,它应该可以帮助您查明代码中导致问题的确切行。

See this article for more detailed instructions.

【讨论】:

  • 这有助于我准确追踪导致崩溃的行/变量,非常感谢!
  • @mbm30075 - Np,很高兴我能帮上忙!
  • 有谁知道如何用 LLDB 做到这一点?
  • @StianHøiland 你有没有为 LLDB 找到类似的选项?
  • 链接到 LLDB 版本:stackoverflow.com/questions/9738994/…
【解决方案2】:

ARC 依赖于 Apple 标准/推荐的命名惯例。检查您是否违反了其中任何一项。

对于初学者,如果“Libraries”是一个实例,则存在命名问题。

【讨论】:

  • 正如我上面提到的,我没有看到这个命名约定规则。你可以发布一个链接到你找到它的地方吗?谢谢!
【解决方案3】:

好吧,所以我觉得有点傻,但我有两台生产机器。在其中一个上,我安装了 Xcode 4.2 beta 的副本以及最终的生产副本。我忘记卸载测试版副本并使用它来运行我的代码。一旦我清除了这些并针对最终发布的 Xcode 4.2 运行我的代码,一切都再次正常运行。

正如我在上面对 Jonathan Grynspan 提到的,我确实了解 Obj-C 内存管理。出于某种原因,我得到了一个保留/释放/释放(由 ARC 执行),并且该错误在最终版本中得到了修复。

感谢您帮助追踪此问题!至少我对为什么存在问题得到了明确的答案!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多