应用代理的application(_:performActionFor:completionHandler:)
.
在该实现中,您应该调用completionHandler
. 它需要一个布尔值。
有谁知道布尔是干什么用的?不管我是通过true
还是通过,我都看不出有什么区别false
。(实际上,即使我忽略调用 !,我也看不出有什么区别completionHandler
!)
应用代理的application(_:performActionFor:completionHandler:)
.
在该实现中,您应该调用completionHandler
. 它需要一个布尔值。
有谁知道布尔是干什么用的?不管我是通过true
还是通过,我都看不出有什么区别false
。(实际上,即使我忽略调用 !,我也看不出有什么区别completionHandler
!)
简短的回答:在 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
寄存器中。但是rsi
register 没有在代码中使用 - 它只是将消息发送到带有参数_updateSnapshotAndStateRestorationWithAction:
的对象。ds:rdi+0x20
ds:rdi+0x28
两者ds:rdi+0x20
和ds:rdi+0x28
都是块内的捕获指针。
认为以参数作为快照功能指标的猜测是错误的。