ios - Objective-C 编译器遗漏了协议(protocol)定义

标签 ios objective-c protocols llvm objective-c-runtime

我正在编写几个使用 Objective-C 运行时库的类。这包括在运行时根据名称检索协议(protocol)定义。但是,似乎未被类显式采用或在代码中使用 @protocol(ProtocolName) 引用的协议(protocol)被排除在编译之外,并且在运行时不可用。

例子:

@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)定义?

最佳答案

您可以强制编译器包含该协议(protocol),方法是创建一个未调用但使用它的虚拟方法。我以前做过:

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

我看到 Apple 在他们的 FxBrightness plug-in from the FxPlug SDK 中使用了它.

关于ios - Objective-C 编译器遗漏了协议(protocol)定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21617871/

相关文章:

ios - 协议(protocol)不返回值

ios - Spritekit : Pausing parent node does not pause child node

objective-c - 当铃声静音时,如何防止我的应用程序(使用 AVPlayer)被静音?

ios - 在 presentationTransitionWillBegin 中使用 animateAlongsideTransition 的问题

iphone - iOS, NSMutableDictionary

c++ - Fedora 17 和 Google Protocol Buffers

swift - 不符合协议(protocol)的属性(property)去哪儿了?

ios - 让用户拍照并在表格 View 中使用它们的最佳做法是什么?

ios - 我应该在我的代码(objective-c)中的什么位置加载动画?

ios - 从 Xcode 6 重新构建应用程序时出现 OSStatus 错误 2003334207