Вы объявляете «протокол» (интерфейсы Objective C), используя
@protocol MyProtocol <BaseProtocol1,...,BaseProtocolN>
//methods and properties
@end
, где <BaseProtocol>
является необязательным и указывает, что MyProtocol
«наследует» интерфейс BaseProtocol
.Протокол NSObject
полезен в этом контексте, поскольку он позволяет использовать
@protocol MyProtocol <NSObject>
//...
@end
, чтобы указать (при необходимости), что соответствующие экземпляры MyProtocol
также имеют стандартные методы NSObject
(например, -retain/-release
и т. Д.).
Затем вы объявляете, что класс "соответствует" протоколу:
@interface MyClass : NSObject <MyProtocol,...,OtherProtocols>
{}
@end
И вы можете проверить, соответствует ли экземпляр протоколу:
id myInstance = ...; //some object instance
if([myInstance conformsToProtocol:@protocol(MyProtocol)]) {
// myInstance conforms to MyProtocol
}
Вы можете дополнительно замолчать предупреждения компилятора, заявив, что переменная содержит экземпляры, соответствующие протоколу (обратите внимание, что динамическая природа Objective-C не позволяет компилятору проверить этот контракт, и вы все равно можете получить ошибки времени выполнения, назначив не- соответствие экземпляра переменной):
id<MyProtocol> o;
В этом случае компилятор будет жаловаться, если вы отправите [o retain]
без MyProtocol
в соответствии с протоколом NSObject
.Вы можете отключить эти предупреждения, объявив MyProtocol
как соответствующий NSObject
, как описано выше, или разделив o
как
NSObject<MyProtocol> o;
, так как NSObject
не единственный корневой объект в Какао (то есть NSProxy
не наследуется от NSObject
), это не обязательно верно, что все экземпляры, соответствующие MyProtocol
, также соответствуют NSObject
.Если вы знаете, что они это делают, вы можете объявить MyProtocol
соответствующим NSObject
.