Obj-C: strdup帧中48字节的malloc内存泄漏

20

我的应用程序中出现了多个内存泄漏问题。对象是Malloc 48字节,它总是来自于负责调用strdup的原始调用者。该对象的历史记录仅显示它被Malloc,没有其他的retain或release。堆栈跟踪不显示我的代码。我能够挑选出的唯一相关部分是:

  10 UIKit _UIGestureRecognizerSendActions
   9 UIKit -[UIScrollView handlePan:]
   8 UIKit -[UIScrollView _endPanWithEvent:]
   7 UIKit -[UIScrollView(Static) _startTimer:]
   6 CoreFoundation CFNotificationCenterAddObserver
   5 CoreFoundation _CFXNotificationRegisterObserver
   4 libnotify.dylib notify_register_dispatch
   3 libnotify.dylib notify_register_mach_port
   2 libnotify.dylib token_table_add
   1 libsystem_c.dylib strdup
   0 libsystem_c.dylib malloc

似乎是在地图视图上滚动时出现了内存泄漏问题,但我不确定如何继续,因为堆栈中没有引用我的任何代码。应该如何诊断此泄漏?

如果需要更多信息,请告诉我。

敬礼, 尼克


这方面有任何进展吗? - bogardon
抱歉,我刚刚才有时间记录这个问题。我创建了一个尽可能简单的测试应用程序,并且只包含一个带有MKMapView的nib文件,我能够重现这个泄漏问题,因此我在苹果公司的bug #11227065下记录了它。 - dark_perfect
这可能是一个已知的 bug,也在 这个 SO 线程 中提到了。 - pixelfreak
3
我想对此发表评论,这样就不需要再浪费时间去寻找答案了。这是在iOS 5.1中引入的问题。在滚动视图和表视图中发生了完全相同的泄漏,这其实是有道理的,因为它们必须以某种方式共享滚动代码。希望能尽快修复。 - 勿绮语
4个回答

11
如果只有48个字节,则所有证据都指向系统框架中的帧(即,分配从未暴露给您的代码),并且没有成千上万个它们,那么我会(a)不会太担心它,但我会(b)立即通过http://bugreport.apple.com/提交一个错误报告。
附上您应用程序的二进制文件以及复现此问题的说明。

嗨bbum,快速回复,谢谢!虽然只有48个字节,但是随着您使用地图的次数增加,它们会累加。我之前没有见过这种泄漏(应用程序已进入高级阶段)-是否值得尝试在5.0或4.3模拟器上查看是否会产生相同的泄漏?无论如何,感谢您的建议! - dark_perfect
对于这些事情来说,模拟器的行为通常与实际测试有很大差异,因此在那里进行测试是无关紧要的。请记录该错误并发布编号。这听起来很可能是框架中的一个(相对较小但每个字节都重要)泄漏问题。 - bbum
嗨bbum,谢谢,我会的,只是想排除可能是我的代码问题。我很快会发布#。 - dark_perfect

1

我认为我已经确认它是在5.1版本中引入的。我能够通过在iPhone模拟器5.1上使用UIScrollView作为活动视图,在我的应用程序处于活动状态时按下主页按钮来每次复制内存泄漏。在iPhone模拟器5.0上运行相同的测试无法重现错误。

希望这可以帮助到您。


0

只是确认这确实是一个经常发生的问题,而不仅仅是你遇到了问题。我曾经在表格滚动和UIScrollView中看到过这种情况。我已经在模拟器上测试过它,并在iPad上分析了发布版本。似乎是5.1中的一个常见问题,但我还没有听说过修复方法。我同意,每次滚动增加48个字节可能会成为一个问题。


0

这可能是由于performselectorinbackground引起的,将其调用放在@autoreleasepool{}块内部。


但是,实际上我也遇到了完全相同的问题,这个解决方法解决了它。 - Frane Poljak
嗨,我也遇到了同样的问题...你是怎么解决这个问题的?在我的情况下,这是一个非常简单的应用程序,但是当我推送和弹出视图控制器时,内存没有释放。在我的视图控制器中,我正在使用滚动视图和其中的图像。 - Vijayvir Sing Pantlia
你需要小心,避免出现保留循环。https://digitalleaves.com/blog/2015/05/demystifying-retain-cycles-in-arc/ - Frane Poljak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接