Xcode仪器,泄漏。“的含义;thunk for@escaping@callee\u guaranted()->;()";

Xcode仪器,泄漏。“的含义;thunk for@escaping@callee\u guaranted()->;()";,xcode,syntax,memory-leaks,instruments,xcode-instruments,Xcode,Syntax,Memory Leaks,Instruments,Xcode Instruments,在试图跟踪Xcode仪器中的内存泄漏时,我经常在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 libobj

在试图跟踪Xcode仪器中的内存泄漏时,我经常在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 libsystem\u malloc.dylib calloc
1 libobjc.A.dylib弱调整大小(弱表,无符号长)
2 libobjc.A.dylib弱寄存器无锁
3 libobjc.A.dylib objc_
4 SpriteKit-[SKNode(setParent)setParent:]
5 SpriteKit-[SKNode insertChild:atIndex:]
6 SpriteKit-[SKNode addChild:]
7最新的PieceNode.setup()/…/PieceNode.swift:66
8 IOSTest LabeledPieceNode.setup()/…/PieceNode.swift:86
9 IOSTest闭包#1在闭包中#1在maskedRectBoard节点控制器中。maskedRectBoard(u:didFill:with:alongGravity:)/…/maskedRectBoard节点控制器。swift:48
10对@escaping@callee_的IOSSTEST thunk保证()->()/…/:0
11 libdispatch.dylib_dispatch_call_block_和_release
12 libdispatch.dylib_dispatch_client_callout
13 libdispatch.dylib_dispatch_main_queue_callback_4CF$VARIANT$mp
14 CoreFoundation\uuu CFRUNLOOP\u正在为主调度队列提供服务__
15核心基金会
16 CoreFoundation CFRunLoopRunSpecific
17图形服务GSEventRunModal
18 UIKitCore UIApplicationMain
19 IOSTest main/../PauseMediator.swift:13
20 libdyld.dylib开始

thunk通常是延迟函数调用周围的一个框(可能会添加一些上下文,也可能需要额外的上下文才能完成)。在Swift中,thunks通常用于帮助管理内存或围绕闭包的调用约定。作为一项规则,你可以忽略这个重击;这是一个实现细节


这真正告诉您的是,您在某处泄漏了一个SKNode,并且SKNode是在调度到主队列的块中创建的(可能使用
DispatchQueue.main.async
)。这个调用堆栈实际上不太可能与泄漏有关。它只是告诉您泄漏对象是在哪里创建的。

谢谢!这个特定泄漏的主题是神秘的,不在这个问题的范围之内。因此,如果我们想象一个闭包是一个结构,那么它将包含一个
thunk
functionPointer
,对吗?thunk通常就是这个结构。闭包通常以thunk的形式实现,但也不一定非得如此。例如,如果立即执行一个闭包,我们可能完全可以避免创建thunk。这种C++的讨论对实现Tunk的一种方式有一些很好的解释(但是你应该把这个讨论作为一种语言来说明,而不是定义):Thunks在懒惰的函数式语言中很常见。如果我有一个返回惰性序列的函数,它可能返回
[(thunk)]
。如果我计算第一个元素,它可能会被替换为
[firstElement,(thunk)]
,等等。thunk的目的是保存一个计算(包括该计算所需的所有上下文),这可能是以后需要的。我第一次听说在这个上下文中有一个“thunk”,不管我的用户名是什么。感谢@RobNapier的简单解释。