Инструменты Xcode, Утечки. Значение "thunk for @escaping @callee_guaranted () -> ()" - PullRequest
2 голосов
/ 02 мая 2019

Я часто вижу эту строку в Stack Trance при попытке отследить утечку памяти в 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

1 Ответ

1 голос
/ 02 мая 2019

Блок обычно представляет собой рамку вокруг отложенного вызова функции (возможно, добавление некоторого контекста и, возможно, требующий дополнительного контекста для завершения).В Swift thunks обычно используются для управления памятью или соглашениями о вызовах вокруг замыкания.Как правило, вы можете игнорировать Thunk;это немного детали реализации.

Что действительно говорит вам о том, что вы пропускаете где-то SKNode, и что SKNode был создан в блоке, отправленном в главную очередь (вероятно, с использованием DispatchQueue.main.async),Маловероятно, что этот стек вызовов на самом деле имеет отношение к утечке.Он просто говорит вам, где был создан протекший объект.

...