『IOS 概念性解說』framework 與. a

mymdeep發表於2017-04-08

ios開發中經常會依賴framework和.a檔案,這兩種檔案有什麼區別呢?今天就聊聊這兩種檔案格式。


動態庫與靜態庫

在說framework和.a檔案之前,先明確一下什麼是靜態庫,什麼是動態庫。

靜態庫

靜態庫即靜態連結庫。靜態庫在編譯的時候會被直接拷貝一份,複製到目標程式裡,這段程式碼在目標程式裡就相當於寫死了,不會發生什麼改變了。

  • 好處就是方便,放在工程中就能用,編譯完成後,跟這個庫檔案就沒什麼關係了。
  • 缺點就是目標程式會增大,拷貝了一份程式進去,能不增大嗎。

    動態庫

    動態庫在編譯時並不會被拷貝到目標程式中,目標程式中只會儲存指向動態庫的引用。等到程式執行時,動態庫才會被真正載入進來。
  • 優點是,不需要拷貝到目標程式中,不會影響目標程式的體積,而且同一份庫可以被多個程式使用。同時,隨時對庫進行替換,而不需要重新編譯程式碼。
  • 缺點是比較麻煩,經常由於外因導致指向不正確,而出現錯誤。同時也會造成一部分效能的損失。

    framework與.a

    framework

    framework可以將庫的二進位制檔案,標頭檔案和有關的資原始檔打包到一起,方便管理和分發。這個有點類似於Android的aar。
    那framework屬於靜態庫呢還是動態庫呢,這個應該是都有的。系統提供的framework就是動態的,比如UIKit.Framework。但是自己做的一般都是靜態的,方便使用。

    .a

    .a是一個純二進位制檔案,有點像Android的jar,不能包含資原始檔,而且.a檔案不能直接使用需要有標頭檔案配合,這個很好理解,C開發嘛,當然需要標頭檔案,.a不能包含標頭檔案,所以需要手動加入標頭檔案,所以這種方式是比較麻煩的。

    如何打包

    framework

    現在可以試著做一個framework

『IOS 概念性解說』framework 與. a

點選這個按鈕

『IOS 概念性解說』framework 與. a

然後建立工程,如下圖所示:

『IOS 概念性解說』framework 與. a

修改一些配置資訊,生成支援所有架構的版本。

『IOS 概念性解說』framework 與. a

新建一對檔案,隨便寫點東西:

『IOS 概念性解說』framework 與. a

配置可以暴露的檔案,一般來說標頭檔案需要暴露,這個有點類似於Android的混淆機制

『IOS 概念性解說』framework 與. a

然後編譯即可,注意編譯的時候選擇模擬器或者Generic iOS Device
編譯成功後,Products下的framework會由紅色變成黑色,就可以使用了:

『IOS 概念性解說』framework 與. a

但是檢視資料夾的時候你會發現,實際生成了兩個framework:

『IOS 概念性解說』framework 與. a

一個是針對模擬器的一個是針對真機的。
如果你想要一個通用版怎麼辦呢?用命令列的方式解決吧!
在工程中,右鍵選擇生成的framework,選擇show in finder:

『IOS 概念性解說』framework 與. a

找到這個檔案 然後進入終端:
輸入lipo -create 然後將上圖中的那個檔案拖進去,這個檔案應該有兩個,一個模擬器的一個真機的。然後在上-output 加上輸出路徑,如下圖所示:

『IOS 概念性解說』framework 與. a

這樣就會在資料夾下生成一個.lipo檔案(原諒我上圖中名字拼錯了,哈哈)
然後將生成的檔案替換之前模擬器或者真機中framework對應的檔案,注意改名,保持一致:

『IOS 概念性解說』framework 與. a

然後這個framework就可以用了。

.a

前面說了,我們可以將.m檔案封裝成.a,加上.h檔案,也可以成為靜態庫檔案。
這次選擇這個:

『IOS 概念性解說』framework 與. a

然後隨便寫點東西:

『IOS 概念性解說』framework 與. a

然後點選執行(注意跟上面一樣,一定要分別對模擬器和真機點選執行各一次),這樣就生成了.a檔案:

『IOS 概念性解說』framework 與. a

這個跟上面一樣,也會生成一個模擬器的.a檔案,一個真機的.a檔案。
還是用上面的命令lipo -create就可以合成通用的.a檔案。

總結

與IOS庫相關的概念就介紹到這裡。這篇文章程式碼較少,主要是用圖片對概念和方法進行了介紹,希望能幫到初入IOS的同學。

相關文章