【问题标题】:Iphone "Device" memory leaksiPhone“设备”内存泄漏
【发布时间】:2011-05-24 03:16:19
【问题描述】:

运行xcode后->用仪器运行->泄漏, 用细齿梳检查模拟器后,(模拟器)仪器->泄漏显示为零。但是当我运行实际设备时,我会得到一个包含大约 100 多个项目的列表,

Leaked Object   #   Address Size    Responsible Library Responsible Frame
GeneralBlock-64 9   < multiple >    576 UIKit   GetContextStack
GeneralBlock-16 7   < multiple >    112 WebCore WebThreadCurrentContext
UIControlTargetAction   5   < multiple >    160 UIKit   -[UIControl addTarget:action:forControlEvents:]
__NSArrayM  5   < multiple >    160 UIKit   -[UIControl addTarget:action:forControlEvents:]
UIButton    5   < multiple >    720 

废话,废话,废话……

我在某处读到有人提到如果您创建任何线程,它们必须在主线程上? (WTF?这没有任何意义)。

是的,我的应用程序使用线程,但仅用于渲染UIAlertViews,它们都夹在[pool autorelease][pool release] 之间,有零个未发布的NSStrings、按钮、小部件。所有被分配、复制、保留、释放的东西。

有谁知道这个线程被池化,导致疯狂的内存泄漏?

提前致谢!

**** 2011 年 5 月 25 日(日本时间上午 11:35)** *********

好的,我想我已经设法确定了我的记忆问题的原因......这是那些 fricken 'AutoRelease UITableViewCells'......他们没有得到及时释放,在他们导致我的应用程序之前崩溃...我只是查看了 AppleTableViewCell API,但没有看到任何关于确定“TV-Cell”是否实际上是“使用中”的信息。因为我的应用程序每页只能容纳 30 个单元格,但这些自动释放单元格会不断增长,直到我收到内存不足警告(124 个电视单元格)。任何人...?知道我怎样才能安全地释放这些......? -

我尝试过使用常规的“Alloc”,并释放直接从 De-queue 中出来的那些,(只是为了让我知道至少有一个很好的数字被释放,但正如预期的那样,它没有像那样..所以我想知道,是否有可能在 ViewDidUnload() for(cells in queue) [release cell] 中执行类似的操作并遍历整个队列,以确保它们都被杀死(当然我不会使用自动发布)任何想法,任何 IOS 大师..?提前谢谢你!-ChinaSailor 40 秒前编辑

【问题讨论】:

  • 一个泄漏的对象可能导致许多其他对象被泄漏...
  • 您不应该(阅读:不需要)在大多数 Cocoa 代码中使用 NSAutoreleasePools(除非您正在实现异步 NSOperation 或类似性质的东西)。我很想看看您如何在代码中使用 NSAutoreleasePools 的示例。
  • 您可能读到的是,您应该只在主线程上更新 UI (UIKit) 元素。

标签: iphone multithreading memory memory-leaks


【解决方案1】:

您需要在启用 Zombies 的情况下运行 Instruments,以便您的泄漏对象在泄漏后可供检查。

仅在环境变量中添加 NSZombieEnabled 是不够的。您也必须在 Instrument 中打开它。本教程帮助了我; How To Debug Memory Leaks with XCode and Instruments Tutorial.

【讨论】:

  • 好吧,不完全确定如何在仪器中专门启用 NSZombies,因为我使用的 xcode(版本 3.2.5)启用了 Zombies,并且根据我在网上看到的关于设置仪器的教程对于僵尸,它完全缺少那些选项,在“目标”下......它没有显示,就像教程中的任何版本一样......它给了我几个选项来“忽略”以“NS”开头的分配,但没有像网站这样的 NSZombieEnable...谢谢...
【解决方案2】:

我在某处读到有人提到如果您创建任何线程,它们必须在主线程上? (WTF?这没有任何意义)。

false - 您可以从主线程以外的线程创建线程。同意,这没有意义。

是的,我的应用程序使用线程,但仅用于呈现 UIAlertViews,它们都夹在 [pool autorelease] 和 [pool release] 之​​间,有零个未释放的 NSStrings、按钮、小部件。所有被分配、复制、保留、释放的东西。

有谁知道这个线程被池化,导致疯狂的内存泄漏?

在主线程上创建和操作 UIKit 对象。期间。

祝你好运!

(尽管该答案可能不是您所有/任何问题的确切原因——从给出的描述来看,它是一个很好的候选者和致命缺陷)

【讨论】:

  • "在主线程上创建和操作 UIKit 对象。期间。"好的,从来没有听说过这方面的任何事情,除了你显然不希望与试图同时访问同一内存的线程发生冲突,如果这就是你的意思......我已经读过,不要产生任何线程来做主图形操作,因为苹果在主线程上处理,但这只是因为线程冲突,而不是因为悬空指针和未释放的内存......或者是......?谢谢!
  • 这是因为 UIKit(和 AppKit)不是为线程安全而设计的。它们被设计为只能从主线程进行操作。您可以对这些对象做出的唯一可移植假设是它们应该仅由主线程创建和操作。尽管从技术上讲,您可以摆脱一些事情 - 现在不要打扰它们,并坚持仅从主线程进行操作和创建。不客气。
  • 我只想写类似:assert([NSThread isMainThread]);
  • 好吧,我想我已经设法确定了我的记忆问题的原因......这是那些 fricken 'AutoRelease UITableViewCells'......他们没有及时释放,之前它们导致我的应用程序崩溃......我只是查看了 AppleTableViewCell API,但没有看到任何关于确定“TV-Cell”是否实际上是“使用中”的信息。因为我的应用程序每页只能容纳 30 个单元格,但这些自动释放单元格会不断增长,直到我收到内存不足警告(124 个电视单元格)。任何人...?知道如何安全地释放这些...?
  • 我尝试过使用常规的 'Alloc',并释放直接从 De-queue 出来的那些,(只是为了让我知道至少有一个很好的数字被释放,但正如预期的那样,它不喜欢那样。所以我想知道,是否有可能在 ViewDidUnload() for(cells in queue) [release cell] 中执行类似操作并遍历整个队列,以确保它们都被杀死(当然我不会使用自动发布)任何想法,任何 IOS 大师..?提前谢谢你!
猜你喜欢
  • 2010-11-23
  • 2011-12-10
  • 2011-05-24
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多