在日常項目開發中,不論是為了兩個公司項目上的業務交流還是為了減少項目的編譯時間,有的時候我們會把項目中的私密內容打包成靜態庫,或者是把項目中變動較少一部分打包成靜態庫以便提高編譯效率,那么下面我們就來學習一下"iOS-靜態庫的創建與使用":
(一)iOS靜態庫、動態庫與Framework靜態庫與動態庫的區別
(1)什么是庫?
庫(Library)直白一點說就是一段編譯好的二進制代碼,加上頭文件就可以供別人使用;(例如: iOS中Objective-C編譯下的.h和.m文件,打包靜態庫后會變為.h和.a文件);
(2)什么是靜態庫?
①靜態庫即靜態鏈接庫(例如: windows下的.lib、Mac和Linux下的.a);
②靜態庫在編譯的時候會被直接拷貝一份,復制到目標程序里并且這段代碼在目標程序里就不會在改變了,我猜這也是該庫叫"靜態庫"的原因;
③靜態庫的利弊:
1)利: 靜態庫在編譯完成之后,庫文件實際上就沒有作用了,目標程序沒有外部依賴,直接就可以運行;
2)弊: 弊端靜態庫會使用目標程序的體積增大;
(3)什么是動態庫?
①動態庫即動態鏈接庫(例如: windows下的.dll、Mac下的.dylib、Linux下的.so);
②與靜態庫相反,動態庫在編譯時并不會被拷貝到目標程序中,目標程序中只會存儲指向動態庫的引用,等到程序運行時,動態庫才會被真正加載進來;
③動態庫的利弊:
1)利:不需要拷貝到目標程序中,不會影響目標程序的體積,而且同一份庫可以被多個程序使用(因為這個原因,動態庫也被稱作共享庫);同時,編譯時才載入的特性,也可以讓我們隨時對庫進行替換,而不需要重新編譯代碼;
2)弊:動態載入會帶來一部分性能損失,使用動態庫也會使得程序依賴于外部環境;如果環境缺少動態庫或者庫的版本不正確,就會導致程序無法運行;
(4)什么時候我們會用到庫呢?
①某些代碼片段需要給別人使用,但是我們不希望別人看到源碼,就需要以庫的形式進行封裝,只暴露出頭文件;
②對于某些不會進行大的改動的代碼,我們想減少編譯的時間,就可以把它打包成庫,因為庫是已經編譯好的二進制了,編譯的時候只需要 Link 一下,不會浪費編譯時間;
說明:上面提到庫在使用的時候需要Link,Link 的方式有兩種:靜態和動態,于是便產生了靜態庫和動態庫("攻城獅"的思維就是這么簡單);
(5)iOS Framework?
①除了上面我們提到iOS的.a和.dylib之外,Mac OS/iOS 平臺還可以使用 Framework,Framework實際上是一種打包方式,將庫的二進制文件、頭文件和有關的資源文件打包到一起,方便管理和分發;在 iOS 8 之前,iOS 平臺不支持使用動態 Framework,開發者可以使用的 Framework 只有蘋果自家的 UIKit.Framework,Foundation.Framework 等等;
②上面這種限制可能是出于安全的考慮,換一個角度講,因為 iOS 應用都是運行在沙盒當中,不同的程序之間不能共享代碼,同時動態下載代碼又是被蘋果明令禁止的,沒辦法發揮出動態庫的優勢,實際上動態庫也就沒有存在的必要了;
③由于上面提到的限制,開發者想要在 iOS 平臺共享代碼,唯一的選擇就是打包成靜態庫 .a 文件,同時附上頭文件;但是這樣的打包方式不夠方便,使用時也比較麻煩,大家還是希望共享代碼都能能像 Framework 一樣,直接扔到工程里就可以用;
④終于在日思夜盼便迎來了iOS對動態庫的支持:iOS 8/Xcode 6 推出之后,iOS 平臺添加了動態庫的支持,同時 Xcode 6 也原生自帶了 Framework 支持(動態和靜態都可以);
⑤但是說道這里博主要告訴一下大家,iOS動態庫且用且珍惜(小心應用審核被拒
注:相關教程知識閱讀請移步到IOS開發頻道。



















