2014-02-07 2 views
2

Я пишу пару классов, которые используют библиотеку времени 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 хотят быть доступными во время выполнения?

+2

Так оно и работает. Как вы можете использовать протокол, если нет класса, который его использует? –

+0

Этот ответ может быть полезным: http://stackoverflow.com/a/11533804/342620 –

+0

Ожидается. Компилятор не генерирует метаданные для объявления протокола и выдает дубликат копии метаданных в любом файле, использующем протокол (либо путем его использования, либо путем написания выражения '@protocol (ProtoName). –

ответ

1

Вы можете заставить компилятор включить протокол, создав фиктивный метод, который не называется, который его использует. Я сделал это раньше:

void preserveProtocolFromBeingTrimmed() 
{ 
    (void)@protocol(BrightnessProtocol); 
} 

Я вижу, что Apple, использует это в своих FxBrightness plug-in from the FxPlug SDK.

+1

Спасибо! Я поддержал это для ссылки на пример кода Apple. Мой надежный ответ - это то, что заставляет включить определения протокола, которые «не используются во время компиляции», что не было бы в случае использования вышеописанного метода. Я надеюсь на что-то большее в соответствии с флагом компилятора и т. Д., Которое заставляет заголовки протоколов, которые включены в качестве целей компиляции, не игнорируются, если они не используются, но я понимаю, что такой флаг может отсутствовать и ваше предложение может быть лучшим/единственным решением. Если лучшего ответа не будет представлено, я соглашусь с вами :) –

Смежные вопросы