【问题标题】:Can I use a memory zone to kill iPhone leaks?我可以使用内存区域来消除 iPhone 泄漏吗?
【发布时间】:2009-09-25 04:32:54
【问题描述】:

我有一个 C++ 类,我在我的 iPhone 应用程序中的 Objective-C++ 控制器中使用它。 C++ 类对一些数据进行一些计算,返回一个结果,然后就完成了——但它像疯了一样泄漏。我想知道我是否可以以某种方式利用内存区域(又名 malloc 区域,又名 allocWithZone)来解决这个问题。我的想法是在一个新区域中分配 ObjC++ 对象,然后以某种方式在这个新区域中自动创建所有 C++ 对象。然后,当它返回时,我将区域杀掉,所有的内存都会自动恢复,即使它已经泄漏了。

但是:文档似乎表明如果我在新区域 X 中分配一个对象,它分配的对象将不会自动也位于区域 X 中。如果这是有道理的,有谁知道如何覆盖该行为,以便该对象的所有后续分配和分配都将在新区域 X 中?

编辑:

    1234563到处都是(需要重构......)。感谢“只是修复你的泄漏”的建议,但目前这并不实用。
  1. 内存没有通过 ObjC 分配泄漏,而是主要通过 C++ 数组新调用(还有几个直接 malloc)。如果这有什么不同的话。

【问题讨论】:

  • 是的,伙计们,我知道无内存泄漏的代码更好。

标签: iphone memory-management memory-leaks malloc


【解决方案1】:

最初,Objective-C 中的区域旨在使开发人员能够在一个区域中分配一堆相关对象,然后将它们全部释放,而无需单独释放每个实例。

在实践中,这被证明是不切实际的。尤其是从 Object 到 NSObject 的移动(从 NeXTSTEP 到 OpenStep)。

现实情况是,应用程序中的对象图通常足够复杂,以至于子图的完全区域隔离几乎是不可能的。特别是,您不能直接或间接地分配 Apple 框架中的任何对象并持有对它们的引用,因为您无法控制所述对象的基于区域的分配。

所以,不,不要那样做。修复你的泄漏。没有灵丹妙药/机制可以避免让您的代码真正工作。

【讨论】:

  • 感谢您提供背景信息。看看我的编辑——泄漏的分配是 C++ 数组 new 或 C 风格的 malloc,而不是 ObjC 分配。所以我不会调用 Foundation 或类似的东西,只是泄漏大量的短裤、整数、无符号字符等小数组。这有什么不同吗?
  • 并非如此。听起来转换丢弃了析构函数(或其他清理代码)?
【解决方案2】:

只需修复您的内存泄漏...

【讨论】:

  • 问题的重点是避免修复内存泄漏。
  • 我的观点是,很少有充分的理由避免这样做。
【解决方案3】:

编码的想法难道不是没有任何泄漏吗?不去清理内存泄漏是一种糟糕的经营方式!

【讨论】:

    【解决方案4】:

    您所讨论的是与区域有关的原始想法的一部分,但这一方面并没有那么好。

    避免泄漏的方法就是避免泄漏。释放你malloc的东西,-释放你需要释放的对象。

    【讨论】:

      【解决方案5】:

      防止泄露真的没那么难。它发生了,但你发现了泄漏并修复它。为了避免一点点深谋远虑和纪律而创建另一个可能很复杂的系统是不值得的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-23
        • 2011-12-10
        • 2011-05-24
        • 2023-03-20
        • 1970-01-01
        相关资源
        最近更新 更多