应用程式委托执行应用程式(_:performActionFor:completionHandler :)可以收到iOS快速动作/快捷项目.
在这个实现中,你应该调用completionHandler.它需要一个Bool.
有谁知道Bool是什么?无论我是否通过真假,我都看不到任何差别. (其实我觉得没有什么区别,即使我忽略了调用finishHandler!)
解决方法
简短的答案:参数在iOS 10中没有用于实现块(猜测在iOS 9中也是这样,但现在无法检查).
长答案:让我们看看完成块内发生了什么:
___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下调用block是NSMallocBlock的一个实例时).没有选择器,所以第二个参数(bool参数)应该存储在rsi寄存器中.但是,在代码中不使用rsi寄存器 – 它只是将消息_updateSnapshotAndStateRestorationWithAction发送到对象ds:rdi 0x20,其参数为ds:rdi 0x28.
ds:rdi 0x20和ds:rdi 0x28都是块内的捕获指针.