2012-05-23 33 views
0

我正在开发一个iPhone应用程序,其中有一个用C语言编写的模块和Objective C。 我正在使用pthread_create创建新线程。 对于内存分配,我已经使用malloc()。iPhone应用程序中的C代码的内存管理

  1. 威尔NSAutoreleasePool *池= [[NSAutoreleasePool的alloc]初始化] 处理这个内存?或者我应该明确地使用free()释放这个内存?

    线程正在连续运行,并且它正在分配大量内存。所以在一点之后,它会给出记忆警告。

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

  3. 有没有什么办法来检查这个线程中的内存泄漏。 Xcode的配置文件工具用于检查目标C代码中的内存泄漏。它会帮助管理C型内存分配吗?

请帮我一把。

回答

0

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

你应该使用free所有内存通过malloc

分配,如果我明确地释放内存会造成问题,以及我使用NSAutoreleasePool?

无。你也必须这样做。

有没有什么办法来检查这个线程中的内存泄漏。 Xcode的配置文件工具用于检查目标C代码中的内存泄漏。它会帮助管理C型内存分配吗?

,据我了解,仪器泄漏紧密相关ObjC运行时系统,因此它不通过malloc分配的内存直接(意思是,通过ObjC运行时不发生)工作。对于MacOSX,Apple提供了几个工具来检测内存泄漏(MallocDebug和泄漏,请参阅here),但它们不适用于iOS应用程序。你可能会尝试在模拟器上运行它们,但我怀疑它们不会给你可靠的结果。另一方面,如果您使用的是普通C库,那么您可以在其周围构建一个由您的整体代码派生而来的普通C测试平台(通过移除iOS特定部分),以便能够在其下进行检查MacOSX的。该测试平台将模拟您的应用程序的工作流程与纯C模块。不过,这将是一项重大的努力,只有当你真的担心这件事时,我才会去做。你有另一种方法是围绕你的C模块构建和ObjC包装,以便你有一个或多个使用C模块的类,并通过init/dealloc方法中的malloc/free分配/释放内存;你可以检查你的ObjC包装器对象没有被使用Instruments泄漏,如果你已经正确地实现了包装器对象,你可以确信你没有泄漏malloc内存。

+0

我可以使用XCode仪器检查这些内存泄漏吗?它显示我malloc的内存分配。但没有显示我泄漏。 – Nir

+0

请参阅我的编辑... – sergio

+0

好的谢谢。将不得不真的做一些努力。 – Nir

0

任何你不发送autorelease消息将不会成为自动释放池的目标。由于您无法将消息发送给纯c对象,因此它们不会受到影响。 C对象总是需要手动管理(即使使用ARC)。