【问题标题】:Memory Management of C code in iPhone applicationiPhone应用程序中C代码的内存管理
【发布时间】:2012-05-23 09:35:35
【问题描述】:

我正在开发一个 iPhone 应用程序,它有一个用 C 和 Objective C 编写的模块。 我正在使用 pthread_create 创建新线程。 对于内存分配,我使用了 malloc()。

  1. 将 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init] 处理这段记忆?或者我应该明确地使用 free() 来释放这个内存?

    线程一直在运行,它正在分配大量内存。所以在某一点之后,它会给出内存警告。

  2. 如果我显式释放内存以及使用 NSAutoreleasePool 会产生问题吗?

  3. 有没有办法检查这个线程中的内存泄漏。 Xcode 的分析工具用于检查目标 C 代码中的内存泄漏。是否有助于管理 C 类型的内存分配?

请帮帮我。

【问题讨论】:

    标签: ios xcode memory


    【解决方案1】:

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init] 会处理这个内存吗?或者我应该明确地使用 free() 来释放这个内存?

    您应该对通过malloc分配的所有内存使用free

    如果我显式释放内存以及使用 NSAutoreleasePool 会产生问题吗?

    没有。你也必须这样做。

    有没有办法检查这个线程中的内存泄漏。 Xcode 的分析工具用于检查目标 C 代码中的内存泄漏。是否有助于管理 C 类型的内存分配?

    据我了解,Instruments Leaks 与 ObjC 运行时系统密切相关,因此它不适用于通过 malloc 直接分配的内存(也就是说,不是通过 ObjC 运行时)。对于 MacOSX,Apple 提供了一些工具来检测内存泄漏(MallocDebug 和泄漏,请参阅here),但它们不适用于 iOS 应用程序。您可能会尝试在模拟器上运行它们,但我怀疑它们不会给您可靠的结果。

    另一方面,如果您使用的是纯 C 库,那么您可以围绕它构建一个从整体代码派生的纯 C 测试平台(通过删除 iOS 特定部分),以便能够在 MacOSX 下检查它.测试平台将使用纯 C 模块模拟您的应用程序的工作流程。不过,这将是一项重大的努力,只有当您真的担心时,我才会这样做。

    您拥有的另一种方法是围绕 C 模块构建和 ObjC 包装器,以便您拥有一个或多个使用 C 模块并通过 init/dealloc 方法中的 malloc/free 为其分配/释放内存的类;您可以使用 Instruments 检查您的 ObjC 包装器对象是否泄漏,如果您已正确实现包装器对象,则可以确定您没有泄漏 malloc 内存。

    【讨论】:

    • 我可以使用 XCode 的工具检查这些内存泄漏吗?它向我展示了 malloc 的内存分配。但没有向我显示泄漏。
    【解决方案2】:

    您未向其发送autorelease 消息的任何内容都不会成为自动释放池的目标。由于您不能将消息发送到普通的 c 对象,因此它们永远不会受到影响。 C 对象总是需要手动管理(即使使用 ARC)。

    【讨论】:

      猜你喜欢
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多