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