objective-c 打包靜態庫
ios庫簡介
ios中的所謂的庫,就是一些封裝好的**的集合,可以用來共享程式**的一種方式。在ios中庫,其實就是一些三方框架,並且這些庫一般都是靜態的,整合自定義動態庫過不了審核。
複製**
ios庫分類
開源
所有**都是公開的,可見的;你可以看到.**件裡的介面,也可以看到.m檔案裡的具體實現。
比如afnetworking、sdwebimage、mjrefresh等等。
複製**
閉源
源**是封閉的,不可見的;只公開呼叫.**件中的呼叫介面,看不到.m檔案中介面的具體實現,是乙個編譯後的二進位制檔案。只暴露.h 檔案。
複製**
動態庫
多個程式使用同乙個動態庫時,每個程式和動態庫鏈結時不會複製,某個程式執行時由系統動態載入到記憶體,供程式呼叫。而且系統只載入一次,多個程式共用庫中的**,節省記憶體。
以".tdb"(xcode7以前為".dylib")或者「.framework」為檔案字尾名。
複製**
靜態庫
多個程式使用同乙個靜態庫時,每個程式和靜態庫鏈結時會被完整的複製到可執行檔案中,被多次使用就有多份拷貝。
以".a"或者「.framework」為檔案字尾名為靜態庫。
複製**
版本
真機-debug版本、真機-release版本、模擬器-debug版本、模擬器-release版本
debug版本含完整的符號資訊,以方便除錯,但是不會對**進行優化;
release版本執行**是進行過優化,大小會比debug版本的略小,執行速度比debug版本快,但是不會包含完整的符號資訊;
一般開發中都打包release版本。
複製**
ios裝置分類
模擬器4s-5: i386 針對intel通用微處理器32位處理器
5s-8 plus: x86_64 是針對x86架構的64位處理器
真機armv6 : iphone、iphone 2、iphone 3g、ipod touch(第一代)、ipod touch(第二代)(已淘汰)
armv7 : iphone 3gs、iphone 4、iphone 4s、ipad、ipad 2(已淘汰)
armv7s : iphone 5、iphone 5c (靜態庫只要支援了armv7,就可以在armv7s的架構上執行)
arm64 : iphone 5s、iphone 6、iphone 6 plus、iphone 6s、iphone 6s plus、iphone 7、iphone 7 plus、iphone 7s、iphone 7s plus、iphone se、iphone 8、iphone 8 plus、iphone x、ipad air、ipad air2、ipad mini2、ipad mini3、ipad pro
靜態庫中的內容
** + 資源
**檔案
oc類的.h和.m檔案、category檔案、c、c++等
資源檔案
**檔案需要呼叫的資源,如、xib檔案、plist檔案等
注意事項
除oc類的.h和.m**檔案檔案外,還有 category 、 c 、 c++ ,在匯入該靜態庫時需要在 xcode -> build settings -> other linker flags 進行特殊設定
other linker flags說明
-objc
unix的標準靜態庫實現和objective-c的動態特性之間有一些衝突:objective-c沒有為每個函式(或者方法)定義鏈結符號,它只為每個類建立鏈結符號。
這樣當在乙個靜態庫中使用分類來擴充套件已有類的時候,鏈結器不知道如何把類原有的方法和分類中的方法進行關聯,就會導致你呼叫分類中的方法時,出現」selector not recognized」,也就是找不到方法定義的錯誤。
為了解決這個問題,引入了-objc標誌,它的作用就是 將靜態庫中所有的和物件相關的檔案都載入進來 。
複製**
-all_load
可以強制載入所有的category、c、c++。該標記值是專門處理-objc的乙個bug的。用了-objc以後,如果類庫中只有category沒有類的時候這些category還是載入不進來。
複製**
-force_load
可以強制載入所有的category、c、c++,但是-force_load後面必須跟乙個指向該.a檔案的靜態庫路徑。
複製**
總結
複製**
打包靜態庫
打包 category 靜態庫
建立工程
刪除工程裡的檔案
新增包內容
更改使用版本
適配架構 ★★
新增庫鏈結標識 ★★
新增公開檔案(暴露標頭檔案)
8. 改變 scheme
生成 .a(release - 真機)
裝置選擇 generic ios device,command + b 進行編譯
找到 .a 路徑
生成 .a (release - 模擬器)
隨便選乙個裝置,command + b 編譯;然後一樣找到檔案
合併 .a 檔案
$ lipo -create 模擬器release.a 真機release.a -output 全路徑/輸出sdk.a
複製**
使用 sdk 打包靜態庫
參考 1 首先生成模擬器下地.a靜態庫,通過命令lipo info libtest.a 可知其architectures in the fat file libtest.a are i386 x86 64 2 再生成device 真機 環境下地.a靜態庫,通過命令lipo info libtest....
打包靜態庫,合併靜態庫
ios靜態庫 a 和framework 合併靜態庫 1,開啟終端,輸入lipo create release iphoneos libsbjson.a release iphonesimulator libsbjson.a output combine libsbjson.a 其中release i...
手動打包 a靜態庫
1.新建.a靜態庫工程 2.實現需要打包的類 3.編譯靜態庫 沒有編譯時是紅色,編譯成功後為黑色 當你選擇編譯器為模擬器時,編譯出來的就是模擬器版本.a靜態庫 當你選擇編譯器為裝置時,編譯出來的就是真機版本.a靜態庫 這時候就可以分別適配真機或者模擬器靜態庫了 但是為了方便我們通常會將兩個版本綜合到...