Протокол объявляет набор сообщений, на которые объект должен ответить (или с помощью @optional
, может ответить). В Objective-C его единственная точка (почти) * - позволить компилятору отмечать предупреждения, если вы передаете объект, который не реализует все методы протокола с правильными сигнатурами.
Рассмотрим простой пример: NSMutalbeDictionary имеет метод -setObject: ForKey: , который устанавливает значение для конкретного ключа. Ключ объявлен как тип id
, что означает, что вы можете передать любой объект, и компилятор не будет жаловаться. Тем не менее, документация для метода гласит:
Ключ копируется (используя copyWithZone:; ключи должны соответствовать протоколу NSCopying).
поэтому, если вы передадите объект, у которого нет метода -copyWithZone:
, вы получите исключение во время выполнения, сообщающее, что ключ не отвечает на -copyWithZone:
. Было бы неплохо, если бы компилятор обнаружил вашу ошибку.
Если бы Apple объявила метод
-(void)setObject:(id)anObject forKey:(id<NSCopying>)aKey;
компилятор знал бы о требовании для -copyWithZone:
(это единственный метод, объявленный в NSCopying ) и обнаружил бы любые случаи прохождения несовместимых объектов во время компиляции. Я думаю, что причина, по которой они этого не сделали, заключается в обратной совместимости. Если bbum читает, он может знать настоящую причину, почему бы и нет.
* Я говорю «почти», потому что вы можете проверить, соответствует ли объект протоколу во время выполнения.