dyld:未找到符号问题(NSMutableAttributedString似乎强烈关联)

时间:2011-03-10 03:53:18

标签: iphone objective-c ios

[编辑]我编辑了问题以隔离问题并更好地帮助其他人。


我在我的应用中使用了NSMutableAttributedString类,这在iOS 3.2及更高版本中可用。我也瞄准了3.1.2版本的设备;为了向后兼容,我使用了以下代码:

CFAttributedStringRef attributedString;
if (NSClassFromString(@"NSMutableAttributedString")) {
    attributedString = (CFAttributedStringRef)[[[NSMutableAttributedString alloc] 
            /* init... to initialize an object */ ] autorelease];
} else {
    attributedString = CFAttributedStringCreate(kCFAllocatorDefault,
            (CFStringRef)NSLocalizedString(@"MessageInEllipse",
            @"Message to show in an ellipse"),
            (CFDictionaryRef)attributes);
    }
}

在第3行中,我直接使用类名NSMutableAttributedString,但我希望链接器之间的链接很弱,所以它只是意味着nil,应用程序可以正常工作。< / p>

然而,我的应用程序在启动时在3.1.2设备上崩溃,抱怨它无法找到符号NSMutableAttributedString。看起来这个类符号是强烈联系的。为什么会这样?

2 个答案:

答案 0 :(得分:0)

您需要将框架链接配置更改为您在代码中测试的框架的“弱”链接。

答案 1 :(得分:0)

并非所有情况下都无法链接到特定类。为了弱连接一个类符号,

  • 基本SDK必须是iOS 4.2或更高版本。
  • 部署目标必须是iOS 3.1或更高版本。
  • 编译器必须是LLVM-GCC 4.2或更高版本,或LLVM-Clang 1.5或更高版本。
  • 您要弱链接的类必须使用NS_CLASS_AVAILABLE宏声明。
  • 该类所属的框架必须存在于部署版本中,否则框架本身必须弱链接。

第三个条件是我的问题,因为我错误地认为我使用的是LLVM(我只在Apple的论坛中找到了这个帮助)。 GCC是Xcode 3的默认值,所以你必须小心。

如果这些条件不成立,则无法使用弱链接。在这种情况下,我不应该使用[NSMutableAttributedString alloc],而应该使用[NSClassFromString(@"NSMutableAttributedString") alloc]

还有一件事要提。正如在@ sza的回答中一样,如果我与框架本身(在这种情况下为Foundation)进行弱链接,即使使用GCC 4.2,我也可以使用弱链接到缺少的类。虽然它可以立即解决问题,但在我看来,似乎应该避免这种做法。我对此很谨慎,因为我不确定链接到框架的弱连接在运行时是如何工作的,但是它不会比强烈链接到框架带来更多的性能开销,因为需要获取有关框架的所有信息在运行时?因此,如果我弱化链接经常使用的框架(确实Foundation),我想我可能会遇到性能问题。至少,如果该框架不适用于某些部署目标,那么引用非常具体地表示与框架的弱链接。

因此,我认为这里的最佳做法是:

  • 始终强烈链接我的部署目标中可用的框架

如果我使用的是在部署目标之后可用的框架类,

  1. 如果我符合要求,则使用弱链接, OR
  2. 始终使用NSClassFromString()来引用该类,无论它是否会在旧版本的iOS中执行。