Xcode Instrumentsのメモリリークを追跡しようとすると、この行がスタックトランスに表示されることがよくあります。
thunk for @escaping @callee_guaranteed () -> ()
_
どういう意味ですか?私は翻訳することさえできませんthunkこれに関連してその技術的な意味は言うまでもありません。フルスタックトレースは次のようになります。
0 libsystem_malloc.dylib calloc
1 libobjc.A.dylib weak_resize(weak_table_t*, unsigned long)
2 libobjc.A.dylib weak_register_no_lock
3 libobjc.A.dylib objc_storeWeak
4 SpriteKit -[SKNode(setParent) setParent:]
5 SpriteKit -[SKNode insertChild:atIndex:]
6 SpriteKit -[SKNode addChild:]
7 IOSTest PieceNode.setup() /.../PieceNode.Swift:66
8 IOSTest LabeledPieceNode.setup() /.../PieceNode.Swift:86
9 IOSTest closure #1 in closure #1 in MaskedRectBoardNodeController.maskedRectBoard(_:didFill:with:alongGravity:) /.../MaskedRectBoardNodeController.Swift:48
10 IOSTest thunk for @escaping @callee_guaranteed () -> () /.../<compiler-generated>:0
11 libdispatch.dylib _dispatch_call_block_and_release
12 libdispatch.dylib _dispatch_client_callout
13 libdispatch.dylib _dispatch_main_queue_callback_4CF$VARIANT$mp
14 CoreFoundation __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
15 CoreFoundation __CFRunLoopRun
16 CoreFoundation CFRunLoopRunSpecific
17 GraphicsServices GSEventRunModal
18 UIKitCore UIApplicationMain
19 IOSTest main /.../PauseMediator.Swift:13
20 libdyld.dylib start
_
Thunkは一般的に遅延関数呼び出しの周りのボックスです(おそらくいくつかのコンテキストを追加し、そしておそらく完了するために追加のコンテキストを必要とする)。 SWIFTでは、閉鎖周辺のメモリを管理するのに一般的に使用されます。原則として、あなたはThunkを無視することができます。それは実装の詳細の少しです。
これが本当にあなたがどこかの場所で漏洩していること、そしてそのSKNodeがメインキューに送出されたブロックで作成されたことです(おそらくDispatchQueue.main.async
を使用して)。このコールスタックが実際にリークと関係があるものがあることはほとんどありません。漏洩したオブジェクトが作成された場所を知るだけです。