С быстрым действием iOS (элемент ярлыка), какова цель параметра обработчика завершения?
Элемент быстрого действия / ярлыка iOS получен реализацией делегата приложения application(_:performActionFor:completionHandler:)
,
В этой реализации вы должны вызвать completionHandler
, Требуется Бул.
Кто-нибудь знает, для чего предназначен Bool? Я не вижу разницы, независимо от того, прохожу ли я true
или же false
, (На самом деле, я не вижу разницы, даже если я пренебрегаю completionHandler
!)
1 ответ
Краткий ответ: параметр не используется при реализации блока в 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
захваченные указатели внутри блока.
Считайте, что предположение с параметром в качестве индикатора для функции моментального снимка было неверным.