11

应用代理的application(_:performActionFor:completionHandler:).

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

有谁知道布尔是干什么用的?不管我是通过true还是通过,我都看不出有什么区别false。(实际上,即使我忽略调用 !,我也看不出有什么区别completionHandler!)

4

1 回答 1

7

简短的回答:在 iOS 10 中的 block 实现中不使用参数(猜想在 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 下调用 block 时,它是 的实例NSMallocBlock)。没有选择器,所以第二个参数(布尔参数)应该存储在rsi寄存器中。但是rsiregister 没有在代码中使用 - 它只是将消息发送到带有参数_updateSnapshotAndStateRestorationWithAction:的对象。ds:rdi+0x20ds:rdi+0x28

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

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

于 2016-09-26T18:35:04.543 回答