0

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

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

    线程连续运行,它正在分配大量内存。因此,在某一点之后,它会发出内存警告。

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

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

请帮帮我。

4

2 回答 2

0

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

于 2012-05-23T09:42:20.563 回答
0

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

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

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

没有任何。你也必须这样做。

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

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

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

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

于 2012-05-23T09:49:07.870 回答