Я приведу вам пример. У меня есть несколько классов ObjC, которые общаются с Flickr API. Один, называемый FKAccount
, может выполнять множество действий, связанных с учетной записью пользователя Flickr, включая загрузку фотографий пользователя, получение его списка контактов и т. Д.
Класс FKAccount
определяет протокол делегата FKAccountDelegate
. Этот протокол определяет несколько методов обратного вызова, которые FKAccount
будет вызывать для своего делегата в зависимости от успеха или неудачи различных сетевых операций Flickr. Не каждое приложение, которое использует FKAccount
, будет заинтересовано в каждой операции Flickr, которую может выполнить FKAccount
.
Если бы требовалось, чтобы каждый класс, претендующий на реализацию протокола FKAccountDelegate
, реализовал каждый метод, вы бы получили множество методов-заглушек (FWIW, в FKAccountDelegate
определены 41 метод). Когда эти методы объявлены в протоколе @optional
, делегату нужно только реализовать обратные вызовы, которые он заинтересован в получении.
Класс FKAccount
проверяет, отвечает ли его делегат методам @optional
в протоколе:
if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) {
[self.delegate accountDidDownloadContacts: self];
}