在ios中使用NSThread时“收到内存警告”

时间:2012-05-24 12:46:27

标签: ios multithreading memory-management

我正在开发iPhone App。我正在使用NSThread连续调用包含C ++代码的函数。 当我使用NSThread或dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ {  功能调用 }  然后它在5分钟后给我“收到内存警告”警告并使应用程序崩溃。 但是当我在主线程/队列上运行这个函数时,它就可以正常工作。

我也尝试过Xcode探测器来检查内存泄漏,但没有发现内存泄漏。

我该如何解决这个问题?

提前感谢。

2 个答案:

答案 0 :(得分:1)

仪器可能看不到所有内存泄漏,特别是如果您通过传递保留功能调用某些C代码。

很难在不知道你的线程包含什么的情况下给你一个答案,但你可能想要检查你的代码是否有未发布的对象/错误释放/销毁的对象。

您还应检查您是否创建了一大堆线程(NSThread),并确保它们在终止后正确释放其内容。

顺便说一句,你的应用程序不应该在收到内存警告时终止,这是来自操作系统的正常消息。调用viewWillUnload / didReceivedMemoryWarning函数时检查您的释放。

您还应该尝试使用模拟器手动创建内存警告

答案 1 :(得分:1)

我在后台线程上使用NSOperationQueue时遇到了类似的问题。 假设您已经在函数中声明了强制NSAutoreleasePool,您可以尝试自己分配/释放对象,除非必要,否则不要使用自动释放,以确保按时释放内存。

第二个建议是使用仪器和分配,看看究竟是什么占用了你的记忆。可能你有一些对象被保留,而不应该被释放。这篇文章对于http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/来说是令人惊叹的,你也可以在这里找到一些有用的信息http://www.cimgf.com/2008/04/02/cocoa-tutorial-fixing-memory-leaks-with-instruments/

否则......您需要发布更多详细信息。

祝你好运!