Прочитав некоторый текст, особенно документ iOS о делегитете, весь метод протокола называется hook, который должен реализовать пользовательский объект-делегат. Но некоторые другие книги назовите эти hook как обратный вызов, в чем разница между ними? Это просто другое имя, но тот же механизм? В дополнение к Obj-C некоторые другие языки программирования, такие как C, также получили hook, такую же ситуацию с Obj-C?
В чем разница между крюком и обратным вызовом?
Ответ 1
Терминология здесь немного нечеткая. В общем, две попытки добиться аналогичных результатов.
В общем случае обратный вызов является функцией (или делегатом), которую вы регистрируете в API, который должен быть вызван в соответствующее время в потоке обработки (например, чтобы уведомить вас о том, что обработка выполняется на определенном этапе)
Крюк традиционно означает нечто более общее, которое служит для модификации вызовов API (например, изменение переданных параметров, контроль вызываемых функций). В этом смысле он обычно намного ниже, чем то, что может быть достигнуто языками более высокого уровня, такими как Java.
В контексте iOS слово hook означает то же самое, что и callback выше
Ответ 2
Два термина очень похожи и иногда используются взаимозаменяемо. Крючок - это опция в библиотеке, так как код пользователя может связывать функцию, чтобы изменить поведение библиотеки. Функция библиотеки не должна запускаться одновременно с кодом пользователя; как в деструкторе.
Обратный вызов - это особый тип привязки, где код пользователя собирается инициировать вызов библиотеки, обычно это вызов ввода-вывода или вызов GUI, который передает управление ядру или подсистеме графического интерфейса. Затем процесс управления "обращает" код пользователя на interupt или signal, поэтому код пользователя может предоставить обработчик.
Исторически я видел крюк, используемый для обработчиков interupt и обратного вызова, используемых для обработчиков событий GUI. Я также вижу, что крючок используется, когда подпрограмма должна быть статической и обратная, используемой в динамическом коде.