我正在编写一些使用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!
有谁知道为什么会这样,甚至更好,如何强制编译器包含在编译时未使用的协议定义,但后来我想在运行时使用它?
答案 0 :(得分:3)
您可以通过创建一个未使用它的虚拟方法来强制编译器包含协议。我之前做过这个:
void preserveProtocolFromBeingTrimmed()
{
(void)@protocol(BrightnessProtocol);
}
我看到Apple在FxBrightness plug-in from the FxPlug SDK中使用了这个。