Xcode 仪器,泄漏。 “thunk for @escaping @callee_guaranted() -> ()”的含义
Posted
技术标签:
【中文标题】Xcode 仪器,泄漏。 “thunk for @escaping @callee_guaranted() -> ()”的含义【英文标题】:Xcode Instruments, Leaks. Meaning of "thunk for @escaping @callee_guaranted() -> ()" 【发布时间】:2019-09-21 08:27:41 【问题描述】:在 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】:thunk 通常是延迟函数调用周围的框(可能添加一些上下文,并且可能需要额外的上下文才能完成)。在 Swift 中,thunk 通常用于帮助管理内存或围绕闭包的调用约定。通常,您可以忽略 thunk;这是一个实现细节。
这真正告诉您的是,您在某处泄漏了 SKNode,并且该 SKNode 是在分派到主队列的块中创建的(可能使用 DispatchQueue.main.async
)。这个调用堆栈实际上与泄漏有任何关系是极不可能的。它只是告诉你泄漏的对象是在哪里创建的。
【讨论】:
谢谢!这个特定泄漏的主题是神秘的,不在这个问题范围内。 所以如果我们想象一个闭包是一个结构,那么它将包含一个thunk
和functionPointer
,对吧?
thunk 通常是那个结构。闭包通常以 thunk 的形式实现,但并非必须如此。例如,如果立即执行闭包,我们可能完全可以避免创建 thunk。这个来自 C++ 的讨论对实现 thunk 的一种方式有一些很好的解释(但你应该把这个讨论看作是一种语言的说明,而不是定义):***.com/questions/2641489/what-is-a-thunk
Thunk 在惰性求值函数式语言中非常常见。如果我有一些返回惰性序列的函数,它可能会返回[(thunk)]
。如果我评估第一个元素,它可能会替换为[firstElement, (thunk)]
等。thunk 的重点是保存稍后可能需要的计算(包括该计算所需的所有上下文)。
我第一次听说这种情况下的“thunk”,尽管我的用户名。感谢@RobNapier 的简单解释。以上是关于Xcode 仪器,泄漏。 “thunk for @escaping @callee_guaranted() -> ()”的含义的主要内容,如果未能解决你的问题,请参考以下文章
仪器在 main.m (Xcode 4.3.1) 中显示泄漏