2014-07-23 98 views
9

在此基礎上問題我們不需要將框架鏈接到XCode項目嗎?

Why don't iOS framework dependencies need to be explicitly linked to a static library

我讀所選擇的答案,還是不明白,所以我做了一個示例項目

Test Project on Github

在測試項目中,我刪除所有框架從鏈接二進制庫文件導航爲主項目和靜態庫(包括基礎。框架和UIKit.framework),基本上,這兩個項目鏈接到0框架。

問題是

  • 在靜態庫,它包括MapKit/MapKit.h不必引用Mapkit.framework的項目,爲什麼它仍然工作?
  • 在主項目中,我從項目中刪除了UIKit.framework和Foundation.framework,爲什麼它仍然工作?
  • 既然現在有效,以後會有什麼問題嗎?

謝謝您的意見。

P.S.通過工作,我的意思是我可以在模擬器上運行,我可以沒有任何錯誤地歸檔主項目。

編輯25/07/2014

我與我工作的真正的應用程序嘗試,這是相同的。

  • 我突出了Foundation,UIKit,CoreData和其他10個文件導航框架,以及所有這些框架。
  • 取消選中工具面板中的目標 - >目標會員
  • 構建:通過,運行:通過

我的應用程序的每一個功能仍然工作正常。我不明白這一點。

回答

25

檢查您的項目構建設置。在LLVM 5.1 - 語言 - 模塊下面,您應該看到「自動鏈接框架」選項。在你的情況下,它聽起來像是設置爲'YES',默認值。

在這種情況下,當您引用編譯器不知道的類時,不會產生錯誤,而是會找出哪個Framework包含該類並將其鏈接起來。在你的代碼中,它將是MKMapView或觸發鏈接的其他MapKit類之一。

編輯:從相關'What's New?' document

自動鏈接是由代碼模塊中引入的框架啓用。當源文件包含來自支持 模塊的框架的頭文件時,編譯器會在目標文件 中生成額外信息以自動鏈接該框架。結果是,在大多數 的情況下,當您使用支持 模塊的框架API時,您不需要指定單獨的框架列表 以與目標鏈接。

看它的另一種方式是,編譯器是足夠聰明,突變#import@import當框架已經建立恰當。所有的系統框架都已經完成。

+0

謝謝@Tommy,是的,它設置爲YES。如果我可能會問,Link Frameworks Automatically的默認值是YES,對吧?如果是這樣,我可以說,當我創建一個新項目時,我不需要鏈接到任何框架? –

+2

是的,默認情況下它現在是'是'。另外,從打開我的舊項目時,當您打開任何早於該功能的內容時,它看起來默認爲「是」。所以我認爲你不必擔心再次在鏈接步驟中明確地列出[正確構建的]框架。迂迴地說:你仍然會鏈接到它們,只是編譯器可以自己弄清楚。 – Tommy

+0

感謝您的澄清,我想這是最近添加的新功能,我沒有閱讀LLVM更改日誌,所以我不知道它。 –

相關問題