iPhone应用程序中C代码的内存管理

Posted

技术标签:

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

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

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

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

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

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

请帮帮我。

【问题讨论】:

【参考方案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)。

【讨论】:

以上是关于iPhone应用程序中C代码的内存管理的主要内容,如果未能解决你的问题,请参考以下文章

C/C++ 内存管理总结

内存管理

iphone(object-c) 内存管理 有效的内存管理 后半部分

在循环 iphone 中创建多个标签的内存管理

在 Objective-C (iphone) 中,如何管理“@protocol”引用的内存?

iphone内存管理问题