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メニューで「ShowExtendedDetail」(または同様のもの)を選択することにより、リークの瞬間にスタックトレースを取得できます。

古い答え:

そうではないと思います。

実際、Instrumentsが「責任あるライブラリ」として表示するのは、実際のmalloc呼び出しが効果的に実行された場所です。

Instrumentsの出力を見ると、原因は次のstrdupとおりです。でリークが発生する可能性はありませんstrdup

OSに(直接的または間接的に)文字列を複製するように依頼したが、結果として得られた文字列のコピーを誤って管理した可能性があります。

Instrumentsが提供する拡張詳細ビューを分析します。これは、呼び出された瞬間のコールスタックを示しますmalloc。これは、コードと呼び出し自体の間に直接的な関係がある場合に役立つことがありますmallocただし、詳細ビューにそのような関係が示されていない場合でも、コードのリークの原因を探し続けてください。

より一般的には、リークが見つかったときにアプリのどの部分が実行されているかを理解するようにしてください(たとえば、10秒ごとなど、個別の時間にリークが分析されるという事実を考慮に入れてください。赤いバーが表示された場合、それは次のことを意味します。リークは過去10秒間に発生しました)、関連するクラスで実行するすべてのメモリ操作を確認します。

私の経験では、InstrumentsがSDKの一部をリークの「責任がある」と表示するのはごく普通のことですが(ケースの100%)、より深い分析では、間違ったコードが私の側にあります。

于 2012-08-02T07:00:12.813 に答える