Я изучаю некоторые основы неофициальных протоколов и реальных протоколов. Меня смущает то, что Cocoa, похоже, использует множество неофициальных протоколов для NSObject. Эти неофициальные протоколы являются категориями NSObject, которые объявляют методы, но фактически не реализуют их.В чем разница между использованием неофициального протокола в NSObject или протоколом с дополнительными методами?
Насколько я понял, единственная причина, по которой они используют неофициальные протоколы (другими словами, категории в NSObject, которые не предоставляют реализации методов), заключается в предоставлении подсказки автозаполнения в Xcode.
Одним из примеров является метод -awakeFromNib, определенный в NSNibLoading.h, который является неофициальным протоколом NSObject. Система загрузки nib проверяет во время выполнения, если объект реализует этот метод. Если это так, то оно вызывает это.
Но теперь представим, что не было никакой функции, называемой неофициальным протоколом. Альтернативой, которая имела бы тот же самый эффект, было бы реальное объявление @protocol, которое объявляет необязательный метод -awakeFromNib. NSObject просто примет этот протокол, и компилятор с радостью предоставит автозаполнение.
Может ли кто-нибудь указать на большую разницу между этими двумя стратегиями? Я не вижу смысла в неофициальных протоколах, но действительно хотел бы это сделать.
Я вижу. Неофициальные протоколы поступают из прошлого, когда факультативных методов протокола не существует. Теперь это имеет смысл. –
Я обновил свой ответ, чтобы также четко указать, что неофициальные протоколы являются продуктом наследия. – PeyloW