应用程序委托的实现收到iOS快速操作/快捷方式项application(_:performActionFor:completionHandler:).
在那个实现中,你应该调用completionHandler.需要一个Bool.
有谁知道Bool是为了什么?我看不出有什么差别,无论我是否通过true或false.(事实上,即使我没有打电话给我,我看也没有区别completionHandler!)
简答:在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+0x20和ds:rdi+0x28被捕获的块的内部的指针.
认为使用参数作为快照功能指示器的猜测是错误的.
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |