Протоколы предназначены только для документации и проверки времени компиляции. После запуска программы среда выполнения не знает и не заботится о том, какие статические типы имеют ваши объекты (за исключением случая, когда метод возвращает структуру, как указано в newacct).
Вы можете обойтись без протоколов вообще, за исключением того, что тогда нет времени компиляции, проверяющего, что у конкретного объекта есть методы, требуемые от него при передаче в конкретный API. Вы можете объявить все свои объекты как тип id
, если хотите, но это фактически отключает компилятор, проверяющий, что любые сообщения, которые вы отправляете им, реализуются объектами. Он также не позволяет использовать точечную запись для свойств.
Учитывая, что у вас есть протоколы, как только вы объявляете объект соответствующим протоколу, например
id<MyProtocol> foo;
Это немедленно включает проверку метода обратно. Без дополнительных методов это означает, что
if ([foo respondsToSelector: @selector(myOptionalSelector)])
{
[foo myOptionalSelector];
}
будет означать предупреждение компилятора. Помещение метода @optional в подавляет это предупреждение, а также не дает компилятору угадывать типы возвращаемых данных и параметров.