【问题标题】:"Received memory warning" when using NSThread in ios在 ios 中使用 NSThread 时出现“收到内存警告”
【发布时间】:2012-05-24 12:46:27
【问题描述】:

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

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

我该如何解决这个问题?

提前致谢。

【问题讨论】:

  • 你将不得不发布一些代码
  • 我面临同样的情况,我选择的最后一个选项是,当我申请创建多达 5 个线程时,我控制线程数,当这 5 个线程完成时,我创建 5 个新线程。

标签: ios multithreading memory-management


【解决方案1】:

仪器可能不会看到所有内存泄漏,尤其是当您通过传递保留函数调用某些 C 代码时。

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

您还应该检查您没有创建一大堆线程 (NSThread),并且它们在终止后正确释放其内容。

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

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

【讨论】:

  • 我继承了 NSObject 所以无法实现 didReceiveMemoryWarning
  • 你的控制器应该处理内存警告。您是否检查过线程完成后的销毁情况?
【解决方案2】:

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

第二个建议是使用 Instruments 和 Allocations,看看究竟是什么占用了你的内存。可能您有一些对象被保留而不是在应该被释放的时候被释放。这篇关于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/

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

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2013-03-05
    • 2011-07-22
    相关资源
    最近更新 更多