未找到符号:_OBJC_CLASS_$_UIPopoverController

发布于 2024-09-05 14:04:25 字数 519 浏览 6 评论 0原文

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

我已将使用 UIPopoverController 的文件移至其自己的文件中,并且在 iPhone 上加载应用程序时不应加载它们。 不过,当我构建应用程序并在设备上进行调试时,我会收到以下错误:

dyld:未找到符号: _OBJC_CLASS_$_UIPopoverController 引用自: /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes 预计在: /系统/库/框架/UIKit.framework/UIKit 在 /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

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

此致, 保罗·皮伦

I am having problems with my universal app.
I have set the Base SDK to iPhone 3.2 and set the target to 3.1.

I have moved the files that are using the UIPopoverController to their own files and they shouldn't be loaded when loading the app on the iPhone.
Still, when I build my app I get the following error when I build and debug to my device:

dyld: Symbol not found:
_OBJC_CLASS_$_UIPopoverController Referenced from:
/var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes
Expected in:
/System/Library/Frameworks/UIKit.framework/UIKit
in
/var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

I really hope someone can help me.

Best regards,
Paul Peelen

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挽梦忆笙歌 2024-09-12 14:04:25

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

有 2 种解决方法,

  1. 将消息中 UIPopoverController 的所有外观(例如 [UIPopoverController alloc])替换为 NSClassFromString(@"UIPopoverController")
  2. 使 UIKit 成为弱链接。

Even if they're not loaded in runtime, those files are still processed in linking. The symbol _OBJC_CLASS_$_UIPopoverController is therefore added into your app as one of those requiring dynamic linking.

There are 2 workarounds,

  1. Replace all appearance of UIPopoverController in a message (e.g. [UIPopoverController alloc]) with NSClassFromString(@"UIPopoverController"), or
  2. Make UIKit weakly linked.
苏辞 2024-09-12 14:04:25

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

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

I strongly recommend you not weakly link UIKit. As KennyTM and I mentioned in our comments, this may hide future linker issues and result in crashes. I'm also simply not comfortable with telling the linker that UIKit is optional when it plainly isn't. Big hack.

Instead, initialize and call UIPopoverController indirectly using NSClassFromString:

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

If you still have linker errors, you may need to call UIPopoverController's messages using NSSelectorFromString:

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

For portability, I recommend writing a proxy object to handle these implementation details.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文