2011-01-14 2 views
5

Я изучаю некоторые основы неофициальных протоколов и реальных протоколов. Меня смущает то, что Cocoa, похоже, использует множество неофициальных протоколов для NSObject. Эти неофициальные протоколы являются категориями NSObject, которые объявляют методы, но фактически не реализуют их.В чем разница между использованием неофициального протокола в NSObject или протоколом с дополнительными методами?

Насколько я понял, единственная причина, по которой они используют неофициальные протоколы (другими словами, категории в NSObject, которые не предоставляют реализации методов), заключается в предоставлении подсказки автозаполнения в Xcode.

Одним из примеров является метод -awakeFromNib, определенный в NSNibLoading.h, который является неофициальным протоколом NSObject. Система загрузки nib проверяет во время выполнения, если объект реализует этот метод. Если это так, то оно вызывает это.

Но теперь представим, что не было никакой функции, называемой неофициальным протоколом. Альтернативой, которая имела бы тот же самый эффект, было бы реальное объявление @protocol, которое объявляет необязательный метод -awakeFromNib. NSObject просто примет этот протокол, и компилятор с радостью предоставит автозаполнение.

Может ли кто-нибудь указать на большую разницу между этими двумя стратегиями? Я не вижу смысла в неофициальных протоколах, но действительно хотел бы это сделать.

ответ

7

Две огромные различия:

  1. Compile проверочные тип времени. Явный протокол с дополнительными методами гораздо более ясен о том, какие методы вы могли бы реализовать. И для явного украшения класса с протоколом он тоже соответствует, и Xcode может предоставить гораздо более точные списки завершения кода того, что вы могли бы реализовать.

  2. Сохраняет NSObject uncluttered. В старых неофициальных протоколах все методы, которые являются необязательными, обычно имели свою реализацию по умолчанию, добавленную к NSObject.

Неофициальные протоколы, в которых четкое решение проблемы, которая больше не существует с момента введения дополнительных методов в протоколы в Objective-C 2.0.

+0

Я вижу. Неофициальные протоколы поступают из прошлого, когда факультативных методов протокола не существует. Теперь это имеет смысл. –

+0

Я обновил свой ответ, чтобы также четко указать, что неофициальные протоколы являются продуктом наследия. – PeyloW

1

Для того, чтобы использовать протокол, вы должны импортировать его, и пусть объект вы кодирование в соответствии с ним

TestViewController : UIViewController <MyAwesomeProtocol> 

Для того, чтобы категории, которые будут использоваться, вы не должны делайте такие вещи, вы можете просто импортировать категорию (которая даже не требуется во всех случаях) и использовать объект (в моем случае UIViewController), как вы это делали, и XCode предоставит вам автозаполнение для методов категории.

Я предпочитаю протокол, он более строгий и надежный. Если вы считаете, что категории имеют проблемы с построением, они являются немного странными (в большинстве случаев не для всех), если честно.

+0

Какие проблемы с строительством? –

+0

Есть случаи, когда вы используете сочетание библиотек или даже сами компилируете библиотеку, а категории, как правило, идут по стене.На данный момент у меня нет четкого примера, но я знаю, что структура три20 вызвала эти проблемы в нашем проекте из-за категорий. Не большой поклонник. – Jake

3

Большая разница в том, что ключевое слово @optional было введено всего несколько лет назад. Для нового кода неофициальные протоколы в основном устарели. Большая часть фреймворков - это не новый код.

Смежные вопросы