应用代表的application(_:performActionFor:completionHandler:)
实施收到iOS快速操作/快捷方式项。
在该实现中,您应该调用completionHandler
。需要一个Bool。
有谁知道Bool是为了什么?无论我是否通过true
或false
,我都没有看到任何区别。 (事实上,即使我没有打电话给completionHandler
,我也看不出任何区别!)
答案 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+0x20
和ds:rdi+0x28
都是块内的捕获指针。
认为使用参数作为快照功能指示器的猜测是错误的。