Я пишу пару классов, которые используют библиотеку времени выполнения Objective-C. Это включает в себя получение определений протокола во время выполнения на основе их имени. Однако оказывается, что протоколы, которые явно не приняты классом или не указаны в коде с использованием @protocol(ProtocolName), исключаются из компиляции и недоступны во время выполнения.
Пример:
@protocol MyProtocol <NSObject>
-(void)doSomething;
@end
//Где-то еще в коде
Protocol *protocol = NSProtocolFromString(@"MyProtocol");
// ^ value of "protocol" will be nil when I run the application!
//Однако, если я использую, делаю следующее:
Protocol *whyDoIHaveToDoThis = @protocol(MyProtocol);
Protocol *protocol = NSProtocolFromString(@"MyProtocol");
// ^ value of "protocol" will now be a pointer as expected when I run the application!
Кто-нибудь знает, почему это так, и даже лучше, как заставить компилятор включать определения протоколов, которые не используются во время компиляции, но которые мне позже понадобятся во время выполнения?
@protocol(ProtoName)
. - person Greg Parker   schedule 07.02.2014