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

mat*_*att 10 ios quickaction

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

在那个实现中,你应该调用completionHandler.需要一个Bool.

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

Rom*_*lov 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
Run Code Online (Sandbox Code Playgroud)

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

ds:rdi+0x20ds:rdi+0x28被捕获的块的内部的指针.

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