找不到符号:_OBJC_CLASS_$_UIPopoverController

17

我在我的通用应用程序中遇到了问题。 我已将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

我真的希望有人能帮助我。

此致, Paul Peelen

2个回答

27
即使这些文件在运行时没有加载,它们仍会在链接过程中被处理。因此,符号 _OBJC_CLASS_$_UIPopoverController 被添加到您的应用程序中,作为需要动态链接的符号之一。
有两个解决方法:
  1. 将消息中所有 UIPopoverController 的出现(例如 [UIPopoverController alloc])替换为 NSClassFromString(@"UIPopoverController"),或者
  2. 将 UIKit 设为弱链接。

7
要将一个库设置为弱链接,选择你的目标,在“信息”中打开它,然后将类型从“必需”更改为“弱”。 - kennytm
1
将UIKit弱链接化是否会有任何后果? - Andy Jacobs
3
@Andy: 某些连接时错误可能会被隐藏,导致应用在运行时崩溃。 - kennytm
1
@thndrkiss 不,它仍然会被批准。这是我选择的选项。 - Paul Peelen
1
想一想:它是UIKit。它不是一个可选库。选择弱链接UIKit将会在以后捆绑你。 - AWrightIV
显示剩余9条评论

5
我强烈建议您不要弱链接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];
}

为了可移植性,我建议编写一个代理对象来处理这些实现细节。

1
这是最佳方法。然而,个人更喜欢使用 if ([UIPopoverControll class] != nil) { ... } - simonbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接