找不到符号:_OBJC_CLASS _ $ _ UIPopoverController

时间:2010-06-08 21:17:46

标签: iphone ipad iphone-sdk-3.1 uipopovercontroller

我的通用应用程序出现问题。 我已将Base SDK设置为iPhone 3.2,并将目标设置为3.1。

我已将使用UIPopoverController的文件移动到他们自己的文件中,并且在iPhone上加载应用程序时不应加载它们。 不过,当我构建我的应用程序时,我在构建和调试到我的设备时出现以下错误:

  

dyld:未找到符号:   _OBJC_CLASS _ $ _ UIPopoverController参考自:   /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes   期望:   /System/Library/Frameworks/UIKit.framework/UIKit   在   /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

我真的希望有人可以帮助我。

祝你好运, 保罗佩伦

2 个答案:

答案 0 :(得分:27)

即使它们未在运行时加载,这些文件仍会在链接中处理。因此,符号_OBJC_CLASS_$_UIPopoverController会添加到您的应用中,作为需要动态链接的符号之一。

有2个解决方法,

  1. 使用[UIPopoverController alloc]
  2. 替换消息中的UIPopoverController的所有外观(例如NSClassFromString(@"UIPopoverController")
  3. 让UIKit弱联系。

答案 1 :(得分:4)

我强烈建议您弱链接UIKit。正如KennyTM和我在评论中提到的,这可能会隐藏未来的链接器问题并导致崩溃。我也很不方便告诉链接器UIKit是明显不可选的。大黑客。

相反,使用NSClassFromString:

间接初始化并调用UIPopoverController
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}

如果仍然有链接器错误,则可能需要使用NSSelectorFromString调用UIPopoverController的消息:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
    self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}

为了便于携带,我建议编写一个代理对象来处理这些实现细节。