【问题标题】:iPhone development - preventing leaksiPhone 开发 - 防止泄漏
【发布时间】:2010-10-03 07:07:37
【问题描述】:

当我使用 Leaks 运行我的应用程序并查看任何泄漏的扩展详细信息时,它会将我带到代码中的特定行,但我不知道在那之后该怎么做!

例如,Leaks 在这一行显示了一个 malloc

NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

但我不知道语句中的问题是什么!有人可以告诉我如何解释这些问题并避免泄漏。

谢谢。

编辑: 关于我之前的问题,NSZombieEnabled 确保没有对象被释放,这增加了内存使用量。因此,在使用 Leaks 进行测试时,请确保从您的应用程序中删除此设置。认为这可能会对某人有所帮助。

【问题讨论】:

    标签: iphone ios memory-management memory-leaks


    【解决方案1】:

    扩展详细信息窗格将为您提供堆栈跟踪,显示泄漏处的堆栈。一般来说,一个好的起点是查看您的方法和堆栈中代码的最后一个方法,看看您在内存方面做了什么,听起来您可能会过度保留一个对象。暂时从这里开始

    【讨论】:

    • 嗨科林。扩展详细信息窗格不显示在僵尸对象的情况下导致泄漏的类或方法。这就是我发布问题的原因。我怎么知道僵尸对象是在哪里创建的?谢谢。
    • 你能把你看到的截图显示一下吗?还有你的目标是什么 iPhone OS 版本?
    【解决方案2】:

    你在调用后释放响应和错误对象吗?这些可能是在调用中分配的。

    【讨论】:

    • 嗨,弗雷德里克。如果我释放响应和错误对象,它会在该位置显示一个 malloc,再次泄漏!当我回到我的 Mac 时,我会发布更多代码和日志。谢谢。
    【解决方案3】:

    您上面提到的方法中的一个泄漏应该在 iPhone OS 2.2 版本中得到修复。您使用的是哪个版本的 iPhone 操作系统?

    【讨论】:

    • 我使用的是 2.1。在 2.2 发布之前创建项目。你确定这是用 2.2 修复的吗?谢谢
    【解决方案4】:

    找到答案。 Fredrik 的回答让我思考。我正在创建一个 NSURLResponse 和 NSError 的实例,然后将其传递给 sendSynchronousRequest 方法。根据 iPhone 的内存管理文档,不应该这样做。我们只需要将 NSURLResponse 和 NSError 对象的引用传递给该方法,该方法负责创建和释放对象。

    希望对其他人有所帮助。非常感谢大家的回答。

    【讨论】: