使用iOS快速操作(快捷项),完成处理程序参数的目的是什么?

时间:2016-09-16 22:51:34

标签: ios quickaction

应用代表的application(_:performActionFor:completionHandler:)实施收到iOS快速操作/快捷方式项。

在该实现中,您应该调用completionHandler。需要一个Bool。

有谁知道Bool是为了什么?无论我是否通过truefalse,我都没有看到任何区别。 (事实上​​,即使我没有打电话给completionHandler,我也看不出任何区别!)

1 个答案:

答案 0 :(得分:5)

简短回答: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

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

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

认为使用参数作为快照功能指示器的猜测是错误的。