Я пишу пару классов, которые используют библиотеку времени Objective-C. Это включает определение определений протокола во время выполнения на основе их имени. Тем не менее, похоже, что протоколы, которые явно не приняты классом или не упоминаются в коде с использованием @protocol (ProtocolName), исключаются из компиляции и не доступны во время выполнения.Компилятор Objective-C не учитывает определение протокола
Пример:
@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!
Кто-нибудь знает, почему это , и еще лучше, как заставить компилятор включить определения протокола, которые не используются во время компиляции, но которые я буду er хотят быть доступными во время выполнения?
Так оно и работает. Как вы можете использовать протокол, если нет класса, который его использует? –
Этот ответ может быть полезным: http://stackoverflow.com/a/11533804/342620 –
Ожидается. Компилятор не генерирует метаданные для объявления протокола и выдает дубликат копии метаданных в любом файле, использующем протокол (либо путем его использования, либо путем написания выражения '@protocol (ProtoName). –