Когда вы объявляете переменную типа
id<MyProtocol> var;
компилятор Objective-C знает только о методах в MyProtocol
и, таким образом, выдаст предупреждение, если вы попытаетесь вызвать любой из NSObject
методов, таких как -retain/-release
, в этом экземпляре. Таким образом, Cocoa определяет протокол NSObject
, который отражает класс NSObject
и методы экземпляра. Объявляя, что MyProtocol
реализует протокол NSObject
, вы даете компилятору подсказку, что все методы NSObject
будут реализованы экземпляром, который реализует MyProtocol
.
Зачем все это необходимо? Objective-C позволяет объектам происходить из любого корневого класса. В Какао NSObject является наиболее распространенным, но не единственным корневым классом. Например, NSProxy
также является корневым классом. Поэтому экземпляр типа id
не обязательно обязательно наследует методы NSObject
.