[编辑]我编辑了问题以隔离问题并更好地帮助其他人。
我在我的应用中使用了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
。看起来这个类符号是强烈联系的。为什么会这样?
答案 0 :(得分:0)
您需要将框架链接配置更改为您在代码中测试的框架的“弱”链接。
答案 1 :(得分:0)
并非所有情况下都无法链接到特定类。为了弱连接一个类符号,
第三个条件是我的问题,因为我错误地认为我使用的是LLVM(我只在Apple的论坛中找到了这个帮助)。 GCC是Xcode 3的默认值,所以你必须小心。
如果这些条件不成立,则无法使用弱链接。在这种情况下,我不应该使用[NSMutableAttributedString alloc]
,而应该使用[NSClassFromString(@"NSMutableAttributedString") alloc]
。
还有一件事要提。正如在@ sza的回答中一样,如果我与框架本身(在这种情况下为Foundation
)进行弱链接,即使使用GCC 4.2,我也可以使用弱链接到缺少的类。虽然它可以立即解决问题,但在我看来,似乎应该避免这种做法。我对此很谨慎,因为我不确定链接到框架的弱连接在运行时是如何工作的,但是它不会比强烈链接到框架带来更多的性能开销,因为需要获取有关框架的所有信息在运行时?因此,如果我弱化链接经常使用的框架(确实Foundation
),我想我可能会遇到性能问题。至少,如果该框架不适用于某些部署目标,那么引用非常具体地表示与框架的弱链接。
因此,我认为这里的最佳做法是:
如果我使用的是在部署目标之后可用的框架类,
NSClassFromString()
来引用该类,无论它是否会在旧版本的iOS中执行。