В Objective-C 2 (т.е. если вы не используете 32-битную среду выполнения в OS X) Protocol
определен как просто прямой класс, см. /usr/include/objc/runtime.h
. Настоящий интерфейс нигде не заявлен. Вы можете попробовать включить /usr/inlcude/objc/Protocol.h
, сказав
#import <objc/Protocol.h>
но, как там написано, для экземпляра Protocol
публично не поддерживается ни один метод. Единственный приемлемый способ работы с экземплярами Protocol
- использовать функции времени выполнения, указанные в Справочник по среде выполнения Objective-C. Это даже не определено публично, является ли Protocol
подклассом чего-либо, и даже не указано, что он реализует протокол NSObject
. Таким образом, вы не можете вызвать для него какой-либо метод.
Конечно, вы можете использовать исходный код среды выполнения, чтобы увидеть, что происходит. Protocol
наследуется от Object
(который является остатком от NeXTSTep до OpenStep), а не от NSObject
. Таким образом, вы не можете использовать знакомые методы для объектов, производных от NSObject
, включая Class
из объектов, производных от NSObject
. См. Реализации с открытым исходным кодом Protocol.h и Protocol.m. Как вы видите, сам класс Protocol
ничего не делает, потому что каждый метод просто приводит self
к protocol_t
и вызывает функцию. Фактически, как видно из функции _read_images
и других в _ 19_, указатель isa
объекта Protocol
устанавливается вручную при загрузке исполняемого файла и библиотек и никогда не используется.
Так что не пытайтесь проверить, является ли id
Protocol
или нет.
Если вам действительно нужно это сделать, вы можете использовать
id foo=...;
if(foo->isa==class_getClass("Protocol")){
...
}
Но, серьезно, не делай этого.
person
Yuji
schedule
21.09.2011