我在我的应用程序中发现了内存泄漏,这是一个 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 框架中的错误吗?
对此的任何帮助表示赞赏。
我在我的应用程序中发现了内存泄漏,这是一个 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 框架中的错误吗?
对此的任何帮助表示赞赏。
编辑:
实际上,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% 的情况),但在更深入的分析中,错误的代码是我的一部分。