2015-02-07 148 views

回答

3

動態框架和靜態框架都是一個包含二進制和其他一些東西的包。該二進制文件稱爲動態庫或靜態庫。

二進制是你編譯後的代碼,你的函數,類,方法變成二進制形式,它們被稱爲符號。

構建項目時。

您的代碼將內置到二進制文件中,我們將其稱爲MyProjectBinary。 如果你的項目鏈接到一個靜態庫,然後建立MyProjectBinary,鏈接器檢查MyProjectBinary中的符號,如果它使用靜態庫的一部分,例如,在靜態庫中使用一個類),那麼鏈接器將複製所有與班級相關的符號,並將它們合併到MyProjectBinary。所以無論您使用多少個靜態庫,您只能得到一個建築結果,即MyProjectBinary

如果你鏈接到動態庫,那麼你告訴鏈接器,當MyProjectBinary正在運行時,會在適當的位置有該動態庫。動態庫不是魔術,事實上,你已經使用了很長時間。 Apple提供的所有框架都是動態庫。當您的應用程序在設備/模擬器上運行時,它們將保證存在。

我們假設您的項目鏈接到名爲MyDynamicLibrary的動態庫。在構建項目時,首先MyProjectBinary仍然與使用靜態庫一樣生成。然後,鏈接器只需添加一些信息到MyProjectBinary,在運行時標記在哪裏找到「MyDynamicLibrary」。從MyDynamicLibrary什麼都不會被添加到MyProjectBinary

當運行項目:

對於使用靜態庫項目,什麼都不會發生,因爲所有所需的代碼裏面MyProjectBinary,它只是運行。

對於使用動態庫項目,當你的代碼調用的函數,而在MyDynamicLibrary,系統將嘗試根據存儲在MyProjectBinary的信息找到MyDynamicLibrary,如果它發現MyDynamicLibrary,然後爲MyProjectBinary,該函數用於像在MyProjectBinary。如果找不到MyDynamicLibrary,則會發生錯誤,並且您的應用將被終止。

那麼,爲什麼我們需要動態庫的iOS 8?

在iOS8之前,應用程序只能有一個可執行二進制文件,因此使用靜態庫是可以的。

但是,當iOS 8出現時,您可以在一個應用程序中提供多個可執行二進制文件,其他二進制文件是擴展的可執行二進制文件。這帶來了一個問題,如果有一些代碼被多個可執行二進制文件使用,並且使用靜態庫,那麼相同的符號將被複制到每個可執行文件中,因此需要更多的空間。這是動態庫派上用場的時候,我們可以將這些代碼放入動態庫中,並且只爲應用程序提供動態庫的一個副本,應用程序及其擴展可以使用相同的動態庫。