靜態庫
1. 靜態庫簡介
-
什么是庫?
庫 就是程序代碼的集合, 是共享程序代碼的一種方式
-
庫的分類?
> 開源庫 公開源代碼, 能看到具體實現 例如SDWebImage, MJRefresh, AFNetworking... > 閉源庫 不公開源代碼, 是經過編譯后的二進制文件, 看不到具體實現,只暴露.h文件 主要分為: 靜態庫 和 動態庫
-
靜態庫的存在形式?
.a .framework
-
動態庫的存在形式?
.dylib .framework
-
靜態庫和靜態庫的區別?
> 靜態庫在鏈接時, 會被完整的復制到可執行文件中; 被多次使用, 就有多份拷貝; > 動態庫則不會復制, 只有一份. 程序運行時動態加載到內存; 系統只加載一次, 多個程序共用, 節省內存; > 但是!!!! 項目中如果使用到自己的動態庫, 不允許上架! > 不過WWDC2014上公布的 蘋果對ios8開放動態加載dylib的接口,也就是說開放了動態庫掛載
-
靜態庫應用場景?
> 保護自己的核心代碼 國內的企業,掌握有核心技術,同時是又希望更多的程序員來使用其技術,因此采用"閉源"的方式開發使用,如百度地圖,友盟等 > 將MRC的項目,打包成靜態庫, 可以在ARC下直接使用, 不需要轉換 設置Objective-C Automatic Reference Counting -> NO
2. 靜態庫和動態庫的制作
-
注意事項:
> 模擬器下的靜態庫和真機下的靜態庫不能共用
-
注意靜態庫所支持的架構
不同機型的CPU, 對應的架構不同; 模擬器: 4s----5 : i386 5s----6sPlus : x86_64 真機: 3gs---4s : armv7 5/5c : armv7s(armv7兼容armv7s) 5s---6sPlus: arm64
查看靜態庫支持的架構
lipo -info 庫文件-
合并靜態庫(模擬器和真機都支持)
lipo -create 庫1 庫2 -output 終極庫
3 .a靜態庫和.framework靜態庫的區別?
1> .a是一個純二進制文件,.framework中除了有二進制文件之外還有資源文件
2> .a文件不能直接使用, 至少要有.h文件的配合; .framework文件可以直接使用
3> .a + .h + sourceFile = .framework
4> 打包靜態庫建議使用.framework
4. 靜態庫開發中的常見問題
問題1: 有些第三方庫會使用到一些圖片素材,例如公司的logo等。
由于Xcode默認在編譯時會把所有的素材文件導入到mainBundle中,直接將文件資源拖到靜態庫或者新建文件夾保存素材文件的方式,最終可能與使用靜態庫的程序沖突。
在靜態庫中如果要使用圖片素材,會利用bundle的手段,步驟:
1> 建立bundle,并且向其中添加圖片
2> 創建一個類方法,返回圖片
3> 編譯
4> 調用方如果需要使用,需要導入 .h + .a + XXX.bundle
問題2: 如果用戶需要導入的頭文件過多怎么加?
建議使用一個主頭文件包含其他頭文件,讓用戶只導入一個主頭文件
問題3: 靜態庫程序怎樣測試?
靜態庫本身就是一個小項目,實現某些功能,但是這些功能在開發中也需要測試.而測試代碼又不能作為靜態庫的一部分
解決方案:創建復合項目,可參考->2.靜態庫和動態庫的制作圖解中->四、靜態庫使用中的一些注意點
5. 補充: swift動態庫打包以及使用
補充: swift支持動態庫打包以及使用,不支持靜態庫。動態庫的打包同上述->2.靜態庫和動態庫的制作圖解中->五、動態庫的制作。
swift暴漏接口, 需要使用public關鍵字