对于 iOS 快速操作(快捷方式项),完成处理程序参数的用途是什么?

With an iOS quick action (shortcut item), what is the purpose of the completion handler parameter?

iOS 快速操作/快捷方式项被 application(_:performActionFor:completionHandler:) 的应用程序委托实现接收。

在该实现中,您应该调用 completionHandler。它需要一个布尔值。

有人知道 Bool 是做什么用的吗?无论我通过 true 还是 false,我都看不出有什么区别。 (事实上​​ ,即使我忽略调用completionHandler,我也看不出有什么区别!)

简答:iOS 10 中块的实现中未使用参数(猜测在 iOS 9 中也是如此,但无法检查现在)。

长答案:让我们看看 completion 块内部发生了什么:

___50-[UIApplication _handleApplicationShortcutAction:]_block_invoke:
push       rbp                               ; XREF=-[UIApplication _handleApplicationShortcutAction:]+132
mov        rbp, rsp
mov        rax, qword [ds:rdi+0x20]
mov        rdx, qword [ds:rdi+0x28]
mov        rsi, qword [ds:0x1179e88]         ; @selector(_updateSnapshotAndStateRestorationWithAction:)
mov        rdi, rax                          ; argument "instance" for method imp___got__objc_msgSend
pop        rbp
jmp        qword [ds:imp___got__objc_msgSend]
; endp

I 运行 this on Intel64, 所以第一个参数应该存储在 rdi 寄存器中(当我们在 ARC 下调用块时它是 NSMallocBlock 的一个实例) .没有选择器,所以第二个参数(bool 参数)应该存储在 rsi 寄存器中。但是 rsi 寄存器未在代码中使用 - 它只是将消息 _updateSnapshotAndStateRestorationWithAction: 发送到对象 ds:rdi+0x20 并带有参数 ds:rdi+0x28.

ds:rdi+0x20ds:rdi+0x28都是块内的捕获指针。

认为以参数为指标的快照功能猜测错误