1、庫是程序代碼的集合,是共享程序代碼的一種方式
2、根據源代碼的公開情況,庫分為兩種類型:開源庫(.h和.m)、 ?SDWebImage/AFNetworking
閉源庫:不公開源碼,經過編譯后的二進制文件,看不到具體的實現
閉源庫又分為:靜態庫和動態庫
靜態庫:.a 和 .framework
動態庫:.dylib和 .framework(ios9取消了.dylib,使用.tbd替代)
3、使用上的區別:
系統提供的都是動態庫,第三方都是靜態庫
靜態庫:鏈接時,靜態庫會被完整的復制到可執行文件,被多次使用就會有多份冗余拷貝,舉個例子來說,手機上有個百度地圖,美團上也集成了百度地圖,都加載了.a文件
動態庫:鏈接時不復制,程序運行時由系統動態加載到內存,供程序使用,系統只會加載一次,供多個程序使用,節省內存, ? ?還是剛才的百度地圖,它只會在系統中存在一次
以前使用第三方動態庫上架的時候容易被拒,前一陣子看審核政策(App Store Review Guidelines)應該是可以了
4、靜態庫開發項目:將核心代碼封裝,業務統計自己寫,公司內部其他產品線誰要使用,就直接下載
游戲:MRC代碼運行在ARC情況下,需要混編,將MRC代碼打包成二進制.a文件,沒有MRC和ARC概念
5、靜態庫的制作
創建工程,選擇Cocoa Touch Static Library(是.a)
就是說導入工程后,切換真機和模擬器,報這個錯誤:
undefined symbols for architecture x86_64 不能運行在x86_64(模擬器)架構上,原因是真機的架構(armv7 arm64),模擬器不支持 ? ? 或者 沒有導入靜態庫build phrases->copy files
查看一個.a或者.framework的架構: cd 到對應的文件夾,lipo -info libHMHib.a(庫的名稱)
蘋果產品:模擬器
iphone 4/4s/5 ?i386架構 ?32位
iphone 5s/6/6sp/6/7/7p ?x86_64架構 64位
真機:
iphone 4/4s armv7 32位
iphone 5 armv7s 32位
iphone 5s/6/6p/6s/6sp/7/7p arm64 64位
合并靜態庫架構:
方式一:使用命令行 lipo -create xxx.a kkk.a -output ? ?生成一個new.a
方式二:選中項目 build settings -> build Active Architecture only(編譯激活,選中哪個模擬器就是激活的哪一個)->Debug ->NO,第二種方法不能真機和模擬器合并
所有架構:都合并 ?選中framework target,Architectures,添加
合并架構,靜態庫體積會增大, ? 問下產品經理,要不要合并
資源包注意事項:
1 資源包中,加載圖片,ImageNamed:默認從mainbundle加載圖片,導入到程序后,就不能使用:在資源包圖片路徑名前加:圖片路徑
2 將 資源包手動的添加到SDK(靜態庫)中
SDK規范
邊開發邊調試,添加target,app項目里手動添加靜態庫
沒有告訴是創建靜態庫還是動態庫,使用Cocoa Touch Framework
在Framework里導入 ?創建的工具類 ?編譯后,路徑里沒有, build phrase->public proj
寫方法測試 ?報錯
Library not loaded :framework 默認是動態庫 需要在Embedded Binaries 導入,將其轉化為二進制
動態庫轉為靜態庫,選中項目-》選中Framework_>搜索Mach-O Type 改Static Library