ios - 对于 iOS 快速操作(快捷方式项),完成处理程序参数的用途是什么?

标签 ios quickaction

iOS 快速操作/快捷方式项由应用程序委托(delegate)的 application(_:performActionFor:completionHandler:) 实现接收。

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

有人知道 Bool 是做什么用的吗?无论我通过 true 还是 false,我都看不出有什么不同。 (事实上​​,即使我忽略调用 completionHandler,我也看不出有什么不同!)

最佳答案

简答:在 iOS 10 中 block 的实现中未使用参数(猜测在 iOS 9 中也是如此,但现在无法检查)。

长答案:让我们看看 completion block 内部发生了什么:

___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 的对象 ds:rdi+0x20: rdi+0x28.

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

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

关于ios - 对于 iOS 快速操作(快捷方式项),完成处理程序参数的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39541098/

相关文章:

ios kmlviewer 加载远程 url 而不是本地文件

iphone - 如何使用 StoryBoard 在 iOS 中添加水平线?

android - QuickAction 和隐藏项目的方法

ios - 从 url 设置 iOS 动态快速操作图标

Flutter 快速操作更改选定的底部导航栏项目

ios - 在某个 IBAction (iOS + Parse) 之后重新加载 View

iphone - 当 UIButton 状态改变时执行操作

android - 实现 QuickActions UI 模式

ios - 如何为SwiftTask框架实现zip功能?