2011-03-10 75 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

相關問題