Подтвердить что ты не робот

В чем разница между крюком и обратным вызовом?

Прочитав некоторый текст, особенно документ iOS о делегитете, весь метод протокола называется hook, который должен реализовать пользовательский объект-делегат. Но некоторые другие книги назовите эти hook как обратный вызов, в чем разница между ними? Это просто другое имя, но тот же механизм? В дополнение к Obj-C некоторые другие языки программирования, такие как C, также получили hook, такую ​​же ситуацию с Obj-C?

4b9b3361

Ответ 1

Терминология здесь немного нечеткая. В общем, две попытки добиться аналогичных результатов.

В общем случае обратный вызов является функцией (или делегатом), которую вы регистрируете в API, который должен быть вызван в соответствующее время в потоке обработки (например, чтобы уведомить вас о том, что обработка выполняется на определенном этапе)

Крюк традиционно означает нечто более общее, которое служит для модификации вызовов API (например, изменение переданных параметров, контроль вызываемых функций). В этом смысле он обычно намного ниже, чем то, что может быть достигнуто языками более высокого уровня, такими как Java.

В контексте iOS слово hook означает то же самое, что и callback выше

Ответ 2

Два термина очень похожи и иногда используются взаимозаменяемо. Крючок - это опция в библиотеке, так как код пользователя может связывать функцию, чтобы изменить поведение библиотеки. Функция библиотеки не должна запускаться одновременно с кодом пользователя; как в деструкторе.

Обратный вызов - это особый тип привязки, где код пользователя собирается инициировать вызов библиотеки, обычно это вызов ввода-вывода или вызов GUI, который передает управление ядру или подсистеме графического интерфейса. Затем процесс управления "обращает" код пользователя на interupt или signal, поэтому код пользователя может предоставить обработчик.

Исторически я видел крюк, используемый для обработчиков interupt и обратного вызова, используемых для обработчиков событий GUI. Я также вижу, что крючок используется, когда подпрограмма должна быть статической и обратная, используемой в динамическом коде.