【问题标题】:iPhone memory leakiPhone内存泄漏
【发布时间】:2011-05-24 01:00:50
【问题描述】:

我知道内存泄漏没什么大不了的,或者因为它们在 sdk 本身中而不受单个开发人员的控制,但我看到的是针对 iOS SDK 4.2 构建的 iPhone 4 上的 32KB。我无法在 3GS 上触发此功能。它是在响应用户交互时发生的(响应于打开照片库,并且泄漏似乎发生在我在照片库中时),因此它可能会迅速累积。

这是我在 iPhone 4 上看到的堆栈跟踪:

   0 libSystem.B.dylib calloc
   1  0x317e8363
   2  0x317e9c41
   3  0x318273ff
   4  0x31827ea5
   5  0x302ea49d
   6  0x302ebe07
   7  0x302eb7c3
   8  0x302ebcab
   9  0x303304cd
  10 UIKit -[UINavigationController _startTransition:fromViewController:toViewController:]
  11 UIKit -[UINavigationController _startDeferredTransitionIfNeeded]
  12 UIKit -[UINavigationController viewWillLayoutSubviews]
  13 UIKit -[UILayoutContainerView layoutSubviews]
  14 UIKit -[UIView(CALayerDelegate) layoutSublayersOfLayer:]
  15 CoreFoundation -[NSObject(NSObject) performSelector:withObject:]
  16 QuartzCore -[CALayer layoutSublayers]
  17 QuartzCore CALayerLayoutIfNeeded
  18 QuartzCore CA::Context::commit_transaction(CA::Transaction*)
  19 QuartzCore CA::Transaction::commit()
  20 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)
  21 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
  22 CoreFoundation __CFRunLoopDoObservers
  23 CoreFoundation __CFRunLoopRun
  24 CoreFoundation CFRunLoopRunSpecific
  25 CoreFoundation CFRunLoopRunInMode
  26 GraphicsServices GSEventRunModal
  27 GraphicsServices GSEventRun
  28 UIKit -[UIApplication _run]
  29 UIKit UIApplicationMain
  30 MyApp main /Users/david/src/MyApp/main.m:14
  31 MyApp start

我在这里的任何地方都看不到我的代码,我不确定如何检查带有地址的符号。有任何想法吗?这可能与我添加的子层有关吗? (这是我在这里看到的唯一可以控制的东西。)

感谢您的帮助。

编辑:正如 GojaN 的问题所指出的(谢谢,GojaN),我完全忘了提到这在仪器中显示为:

Leaked Object # Address Size Responsible Library Responsible Frame
GeneralBlock-36864   0x4ff3000 36864 UIKit -[UINavigationController _startTransition:fromViewController:toViewController:]

【问题讨论】:

  • 你怎么知道有内存泄漏?控制台中是否出现消息?您可以将控制台输出粘贴到您的问题中吗?

标签: iphone ios ios4


【解决方案1】:

你知道这是泄漏吗?很有可能是缓存。 (半相关:我看到我的 PDF 查看应用程序中的内存不断增长,看起来像是泄漏。但它显然正在缓存每一页,当我关闭 PDF 文档时它们都消失了。)

泄漏通常发生在模拟器和设备中,是否发生在那里?

这是在运行循环中运行的代码,但可能由您的代码启动。那么每次运行代码时,这个块是否都会泄露?

【讨论】:

  • 好问题。根据泄漏仪器,这是泄漏。但是,我无法在模拟器中重现它,并且每次运行代码时都不一定会泄漏。似乎它可能是为了响应内存警告而发生的,所以我可能会更仔细地查看一下。
  • 你可以试试 Hardware > Simulate Memory Warning in the Simulator 然后。
【解决方案2】:

您应该查看 Xcode“构建”菜单中的“构建和分析”选项。它会从编译时的角度向您显示代码可能泄漏的位置。

【讨论】:

  • 谢谢,是的,我一直在定期运行静态分析器。虽然它在几个地方有所帮助,但在这里没有检测到任何东西。
【解决方案3】:

在这之后不久,我的手机开始表现得很奇怪。我删除了我的应用程序,重新安装了它,但无法再次发生这种情况。由于它之前相当一致且易于复制,因此我将不得不将其归结为直接的不稳定。

感谢提供建议的人。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 2011-12-10
    • 2023-03-20
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多