Xcode Instruments,Leaks。"thunk for @escaping @callee_guaranteed() -> ()"的含义。

17

在尝试使用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
1个回答

23
通常是对延迟函数调用的包装(可能添加一些上下文,也可能需要其他上下文来完成)。在Swift中,thunk通常用于帮助管理闭包周围的内存或调用约定。通常情况下,可以忽略thunk;它只是一个实现细节。

这实际上告诉你的是,你在某个地方泄露了一个SKNode,并且该SKNode是在分派到主队列的块中创建的(可能使用DispatchQueue.main.async)。这个调用堆栈与泄漏无关。它只是告诉你泄漏对象的创建位置。


1
谢谢!这个特定泄漏的主题是神秘的,与这个问题无关。 - kelin
如果我们把闭包想象成一个结构体,那么它会包含一个“thunk”和“functionPointer”,对吗? - kelin
1
thunk通常会是那个结构。闭包通常被实现为thunk,但不一定要这样做。例如,如果闭包立即执行,我们可能根本不需要创建thunk。这篇来自C++的讨论有一些很好的解释,介绍了thunk可以如何实现(但你应该将这个讨论视为一个语言的例证,而不是定义):https://dev59.com/_XE85IYBdhLWcg3wvF8R - Rob Napier
Thunks在惰性求值的函数式语言中非常常见。如果我有一些返回惰性序列的函数,它可能会返回[(thunk)]。如果我评估第一个元素,它可能会被替换为[firstElement,(thunk)]等等。Thunk的重点是保存可能稍后需要的计算(包括执行该计算所需的所有上下文)。 - Rob Napier
1
这是我第一次在这个上下文中听到“thunk”,尽管我的用户名是如此。感谢@RobNapier提供的简单解释。 - Rethunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接