1

我在我的应用程序中发现了内存泄漏,这是一个 ARC 转换的应用程序。

仪器显示泄漏责任库是libsystem_c.dylib

我在这里附上屏幕截图..

我已经搜索了这个问题,我发现了相关的帖子

Instruments-show-leak-in-main-m-xcode-4-3-1

obj-c-memory-leak-of-malloc-48-bytes-in-strdup-framework

它是 iOS 5.1 框架中的错误吗?

对此的任何帮助表示赞赏。

在此处输入图像描述

在此处输入图像描述

4

1 回答 1

1

编辑:

实际上,iOS SDK 5.1 strdup(或相关)中似乎存在一些错误之王。请参阅开发者论坛中的此线程。

如果您可以深入研究 Elements 示例(据说可以揭示该错误)并查看您是否使用相同类型的功能,那将会很有趣。

这是泄漏时的堆栈跟踪:

 0 libsystem_c.dylib malloc
 1 libsystem_c.dylib strdup
 2 libnotify.dylib token_table_add
 3 libnotify.dylib notify_register_mach_port
 4 libnotify.dylib notify_register_dispatch
 5 CoreFoundation _CFXNotificationRegisterObserver
 6 CoreFoundation CFNotificationCenterAddObserver
 7 UIKit -[UIScrollView(Static) _startTimer:]
 8 UIKit -[UIScrollView _endPanWithEvent:]
 9 UIKit -[UIScrollView handlePan:]
10 UIKit _UIGestureRecognizerSendActions
11 UIKit -[UIGestureRecognizer _updateGestureWithEvent:]
12 UIKit ___UIGestureRecognizerUpdate_block_invoke_0541
13 UIKit _UIGestureRecognizerApplyBlocksToArray
14 UIKit _UIGestureRecognizerUpdate
15 UIKit _UIGestureRecognizerUpdateGesturesFromSendEvent
16 UIKit -[UIWindow _sendGesturesForEvent:]
17 UIKit -[UIWindow sendEvent:]
18 UIKit -[UIApplication sendEvent:]
19 UIKit _UIApplicationHandleEvent
20 GraphicsServices PurpleEventCallback
21 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
22 CoreFoundation __CFRunLoopDoSources0
23 CoreFoundation __CFRunLoopRun
24 CoreFoundation CFRunLoopRunSpecific
25 CoreFoundation CFRunLoopRunInMode
26 GraphicsServices GSEventRunModal
27 UIKit UIApplicationMain
28 TheElements 0x300a
29 TheElements 0x2fc3

您可以通过在 Instruments View 菜单中选择“Show Extended Detail”(或类似的东西)来获取泄漏时的堆栈跟踪。

旧答案:

我怀疑不是。

事实上, Instruments 向您展示的“责任库”是实际malloc调用被有效执行的地方。

如果您查看 Instruments 的输出,罪魁祸首是strdup:不可能有泄漏strdup

您更有可能要求操作系统(直接或间接)复制某些字符串,但随后错误地管理了字符串的结果副本。

分析 Instruments 为您提供的扩展详细信息视图,其中显示了调用时的调用堆栈malloc。如果您的代码和调用本身之间存在直接关系,这可能会有所帮助。malloc但是即使详细视图没有显示这种关系,也要继续寻找代码中泄漏的原因。

更一般地说,当发现泄漏时,尝试了解您的应用程序的哪个部分正在运行(考虑到泄漏是在离散时间分析的事实,例如每 10 秒,所以当您看到红色条出现时,这意味着泄漏是在最后 10 秒内产生的),并查看您在相关类中执行的所有内存操作。

根据我的经验,Instruments 将 SDK 的某些部分显示为对泄漏“负责”是很正常的(100% 的情况),但在更深入的分析中,错误的代码是我的一部分。

于 2012-08-02T07:00:12.813 回答