【问题标题】:Fixing memory leaks in Cocoa/ObjC修复 Cocoa/ObjC 中的内存泄漏
【发布时间】:2010-11-20 07:24:19
【问题描述】:

我的程序存在严重的内存泄漏问题。我正在使用 Apple 的 Instruments 来跟踪我的泄漏,在我的应用程序启动后的最初几秒钟内,列出了成百上千的泄漏。问题是他们似乎都没有告诉我泄漏是从哪里来的。

我已经完成了所有课程,并确保分配的所有内容最终都被释放,并且垃圾收集也已启用。另一个大问题是我尝试在未启用垃圾收集的情况下启动我的应用程序,但它只是崩溃了。

有什么建议吗?

谢谢

编辑:如果需要源代码,我可以通过电子邮件发送给它

【问题讨论】:

    标签: objective-c cocoa memory-management memory-leaks garbage-collection


    【解决方案1】:

    您的问题被标记为“垃圾收集”。

    您是否打开了 GC?如果是这样,它是命令行工具吗?您是否将 objc_startCollectorThread() 作为 main() 中的第一项调用?

    如果您打开了 GC,Leopard 上的泄漏分析在某些情况下会显示很多误报。如果您可以访问 Snow Leopard,我建议您在那里进行分析,因为这些工具得到了显着改进。

    clang 静态分析器和仪器是完全正交的。您需要同时使用这两种方法,因为静态分析器不会发现代码中的所有潜在泄漏。尤其是,它不会发现缓存无限制增长或全局可变集无意中生成对象图的情况。

    一旦解决了静态分析器发现的所有问题,就可以使用 Instruments。

    【讨论】:

    • GC 已打开,它是一个 Cocoa GUI 应用程序,而不是命令行工具。我已经修复了分析仪报告的所有泄漏,但 Instruments 仍然报告大量内存泄漏,原因我不知道。我不知道我的应用程序中的泄漏发生在哪里。
    • 当我启动我的应用程序时,Xcode 调试器控制台中也有这些 malloc: free_garbage 错误:MyApp(9874,0xb0103000) malloc: free_garbage:garbage ptr = 0x101bfb0, has non-zero refcount = 1 There每次启动时就像其中的 10 个,每个都有不同的地址码(例如 0x101bfb0)
    • 如果您可以访问它,请使用 Snow Leopard 进行开发。内存分析工具(GC 和非 GC)要好很多倍。
    【解决方案2】:

    尝试通过AnalysisTool 运行您的项目,看看会发现什么。它本质上是 Clang 静态分析器的 GUI 前端。它将运行您的代码并发现诸如泄漏和错误发布等错误。然后,它会逐步向您展示它们,以帮助您更好地了解您在哪里犯了错误。

    这是一个很棒的工具。

    【讨论】:

    • 非常感谢大家,这个工具比 Instruments 好得多。我会看看我能解决什么:)
    • 我修复了 AnalysisTool 报告的所有问题,但 Instruments 仍然报告大量内存泄漏
    猜你喜欢
    • 2010-12-01
    • 2012-01-12
    • 2013-07-29
    • 2017-07-29
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多