当我尝试在Xcode Instruments中跟踪内存泄漏时,我经常在Stack Trance中看到这一行:
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
答案 0 :(得分:1)
通常,thunk是围绕延迟的函数调用的框(可能添加了一些上下文,并且可能需要其他上下文才能完成)。在Swift中,thunk通常用于帮助管理内存或在闭包周围调用约定。通常,您可以忽略重击;有一些实现细节。
这实际上是在告诉您,您正在某个地方泄漏一个SKNode,并且该SKNode是在分配给主队列的块中创建的(可能使用DispatchQueue.main.async
)。该调用堆栈实际上与泄漏没有任何关系。只是告诉您泄漏对象的创建位置。