До пересмотра Objective-C, который был выпущен с OS X 10.5 и iPhone SDK, под названием "Objective-C 2.0", можно было создавать дополнительные протоколы только с использованием категорий. В Objective-C 2.0 новое ключевое слово @optional было добавлено в протоколы, чтобы отметить, какие методы были необязательными (остальная часть неявно требуется).
Так что я думаю, что вы видите небольшую задержку с более ранних дней до ключевого слова @optional.
Редактировать: Чтобы ответить на продолжение, появившееся в исходном вопросе: мотивация для использования категории в NSObject / id для неформального протокола частично заключается в документировании и группировании методов, которые объект может вызывать в своем источнике данных (или делегате). или что-то еще), и в меньшей степени, чтобы избежать предупреждений компилятора о том, что вы вызываете методы, о которых не знает компилятор, будут присутствовать в объекте, который получает вызов. Представьте, что вы один из тех, кто реализует класс, который вызывает эти методы источника данных - вы, вероятно, захотите проверить, присутствует ли этот метод, используя [obj responsedsToSelector: @selector (my: datasource: method :)] всякий раз, когда вы заинтересованы в вызове my : источник данных: метод: метод объекта obj.