私はシンプルなNSCollectionView
を持っていて、それぞれがチェックボックスとその下のタイトルを持つ一連のイメージを表示しています。私はLeaksプロファイリングツールを使って実行しましたが、いくつかのリークがあります。私は漏れがどこから来たのかを理解しようとしています。漏れのスタックトレースにコードが表示されないためです。たとえば、コレクションにいくつかのアイテムを表示するだけで、イメージを選択してウィンドウを閉じると、1539個のオブジェクトが漏れてしまいます。NSMutableIndexSet
これらのリークのためのスタックトレースのほとんどは、次のようになります。NSCollectionViewを使用しているときにリークが見られる
0 libsystem_malloc.dylib malloc_zone_calloc
1 libsystem_malloc.dylib calloc
2 libobjc.A.dylib class_createInstance
3 Foundation NSAllocateObject
4 AppKit -[NSCollectionViewLayoutAccessibility _visibleSections]
5 AppKit -[NSCollectionViewLayoutAccessibility _dumpVisibleChildren]
6 AppKit -[NSCollectionViewLayoutAccessibility accessibilityInvalidateLayout]
7 AppKit -[NSCollectionView layout]
8 AppKit -[NSView _doLayout]
9 AppKit -[NSView _layoutSubtreeWithOldSize:]
10 AppKit -[NSView _layoutSubtreeWithOldSize:]
11 AppKit -[NSView _layoutSubtreeWithOldSize:]
12 AppKit -[NSView _layoutSubtreeWithOldSize:]
13 AppKit -[NSView _layoutSubtreeWithOldSize:]
14 AppKit -[NSView _layoutSubtreeWithOldSize:]
15 AppKit -[NSView _layoutSubtreeWithOldSize:]
16 AppKit -[NSView _layoutSubtreeWithOldSize:]
17 AppKit -[NSView _layoutSubtreeWithOldSize:]
18 AppKit -[NSView layoutSubtreeIfNeeded]
19 AppKit -[NSWindow(NSConstraintBasedLayout) _layoutViewTree]
20 AppKit -[NSWindow(NSConstraintBasedLayout) layoutIfNeeded]
21 AppKit ___NSWindowGetDisplayCycleObserver_block_invoke6358
22 AppKit __37+[NSDisplayCycle currentDisplayCycle]_block_invoke
23 QuartzCore CA::Transaction::run_commit_handlers(CATransactionPhase)
24 QuartzCore CA::Context::commit_transaction(CA::Transaction*)
25 QuartzCore CA::Transaction::commit()
26 QuartzCore CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*)
27 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__
28 CoreFoundation __CFRunLoopDoObservers
29 CoreFoundation CFRunLoopRunSpecific
30 HIToolbox RunCurrentEventLoopInMode
31 HIToolbox ReceiveNextEventCommon
32 HIToolbox _BlockUntilNextEventMatchingListInModeWithFilter
33 AppKit _DPSNextEvent
34 AppKit -[NSApplication _nextEventMatchingEventMask:untilDate:inMode:dequeue:]
35 AppKit -[NSApplication run]
36 AppKit NSApplicationMain
37 libdyld.dylib start
マイコレクションビューのデータソースとデリゲートのコードは非常に簡単です。私はなぜこれらが漏れているのか理解していない。誰も私がここで何が起こっているのか理解するのを助けることができる?
私のコードでは、NSMutableIndexSet
オブジェクトをいくつか割り当てていますが、それらは自動リリースされたインスタンスなので、それらを漏らさないでください。 (また、スタックトレースは、私のコードがそれらを作成する場所から来ていないことを示しているので、関連していないようです。) Xcode 8.2.1とMacOS 10.11.6(El Capitan)で動作します。
リークの1つまたは2つは、スタックトレースに2行のコードを表示します。基本的には、ウィンドウコントローラの-loadWindow
メソッドへの呼び出しがスタックの途中に表示されます。これらのリークが表示されたときにウィンドウの割り当てが解除されないので、ウィンドウに保持されているものがメモリに残っていれば、メモリに残ります(したがってリークはありません)。