【问题标题】:objective-c object not getting dealloc:edobjective-c 对象没有得到释放:ed
【发布时间】:2009-09-21 16:32:25
【问题描述】:

我遇到了一个问题,即在objective-c 中没有释放对象。我很确定这是因为它被保留在某个地方,但我不知道在哪里(检查应该为 0 的 retainCount 返回 1)。我已经多次浏览了我的代码,但没有看到我没有发布的保留它的内容。甚至可能是我正在使用的框架中的错误。

你会如何处理这样的事情?我想也许您可以搜索内存并查看指向该对象的内容,从而更容易弄清楚为什么会这样,但我不太确定如何实现。也许还有其他解决方案?

【问题讨论】:

    标签: objective-c retain dealloc


    【解决方案1】:

    Instruments 很棒,如果它们被泄露了,它可以拾取泄露的对象,但是在这种情况下,我建议你首先使用 Xcode Static Analyzer,这是 Xcode 3.2 中的新功能雪豹。 (如果你在 Leopard 上,你可以使用command-line version。)静态分析可以让你在不执行代码的情况下发现很多问题,而且在很多情况下比 Instruments 更容易使用。

    【讨论】:

    • 我听说 clang 不适用于 obj-c++。 Xcode 静态分析器会这样做吗?如果是这样,我正在认真考虑升级到 Snow Leopard。
    • Xcode 静态分析器 Clang 静态分析器,只是具有更好的 IDE 集成,并且都使用 Clang 作为前端解析器。 Clang尚未与 C++ 一起工作,但正在稳步取得进展。 clang.llvm.org/cxx_status.html 由于 Clang 本身是用 C++ 编写的,我相信您可以想象作者对支持该语言的承诺程度。 :-)
    • 不过,需要注意的是,Objective-C 的支持非常棒,一个工具就可以为您节省无数时间来追踪内存泄漏的源头。
    • 好吧,我想我现在会坚持使用 Instruments,稍后再升级到 Snow Leopard。 :) 感谢您的提示。
    【解决方案2】:

    你试过Instruments吗?

    【讨论】:

    • 哇,谢谢。我完全忘记了那个应用程序。奇怪的是,当我开始使用工具调试我的程序并且没有看到任何错误时,就开始调用 dealloc。 :s
    • O man Instruments 如果 fkn 真棒!直到现在才真正使用它,但它非常有用。
    【解决方案3】:

    覆盖 -retain 和 -release,然后设置断点以查看谁在调用它们。

    【讨论】:

    • 我在某处看到了这个解决方案,它似乎是一个非常简单且很好的解决方案。但是,我怎么知道谁在调用释放和保留?唯一的 arg 是 self?
    • 这可以帮助确定谁打电话给他们,但对于谁不是来说就不是那么回事了——你仍然需要弄清楚这一点你自己。 Xcode 静态分析器是一种更加优雅和轻松的方法,并且适用于大多数 情况,因为大多数泄漏是由于在将对象交给其他人之前分配和未正确释放对象等造成的。跨度>
    • 你问过“但是,我怎么知道谁在调用 release 和 retain?”如果您在 -retain 和 -release 中设置断点,那么当这些断点被命中时,您可以检查调用堆栈,该堆栈将显示谁调用了保留/释放。
    猜你喜欢
    • 2010-12-22
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多