2011-03-10 91 views
0

[编辑]我编辑了问题以隔离问题并帮助其他人更好。dyld:找不到符号问题(NSMutableAttributedString似乎被强连接)


我用我的应用程序,这是在iOS 3.2及更高版本NSMutableAttributedString类。我也瞄准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这里和应用程序将工作没有问题。

但是,我的应用在3.1.2设备上启动时崩溃,抱怨它无法找到符号NSMutableAttributedString。看起来这个班级符号是强烈联系的。为什么会发生?

回答

0

弱链接到特定的类在所有情况下都不可用。为了弱链接一个类符号,

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

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

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

还有一件事值得一提。正如在@ sza的答案中所述,如果我与框架本身(在这种情况下为Foundation)弱联系,即使使用GCC 4.2,我也可以使用弱链接来连接缺失的类。虽然它可以立即解决问题,但在我看来,这似乎是一种应该避免的做法。我对此持谨慎态度,因为我不确定链接到框架的弱连接在运行时是如何工作的,但是它不会强制连接到框架带来更多的性能开销,因为需要获取关于框架的所有信息在运行时?因此,如果我与经常使用的框架(肯定是Foundation)弱联系,我想我可能会遇到性能问题。至少,如果该框架不适用于您的部分部署目标,则说明文档非常具体地指出与框架的弱链接。

因此,我认为这里的最佳实践是:

  • 一直强烈反对,在我的部署目标

可用,如果我使用的是类的框架,框架链接成为部署目标后可用,

  1. 使用弱连接,如果我能满足要求,
  2. 总是使用NSClassFromString()来引用该类,而不管它是否会在旧版本的iOS中执行。
0

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

+0

实际上,当框架本身可用于部署目标并且只有类缺失时,我发现依赖与框架的弱链接(以弱链接类标记)并不是最佳实践。我发布了一个答案来描述我最近发现的东西。但是,你引导我走向正确的方向,我很感激! – MHC 2011-03-12 22:03:58

相关问题