Насколько я понимаю, протоколы похожи на интерфейсы в других языках — они объявляют ожидаемые методы — в то время как категории позволяют вам добавлять новые методы к существующим типам (возможно, даже к типам, которыми вы не владеете).
Почему же тогда iPhone SDK иногда использует категории для объявления типов делегатов? Обычно я ожидаю, что все делегаты будут иметь тип id‹MyDelegateProtocol›, но есть много примеров, когда это не так.
Например, см. нсурлконнектион. Его делегат имеет тип «id», а «контракт» объявлен как категория в NSObject (NSURLConnectionDelegate).
Итак: какова мотивация использования категорий в этих случаях?