С быстрым действием 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 захваченные указатели внутри блока.

Считайте, что предположение с параметром в качестве индикатора для функции моментального снимка было неверным.

Другие вопросы по тегам