1、靜態(tài)庫介紹
什么是庫?
庫是程序代碼的集合,是共享程序代碼的一種方式
根據(jù)源代碼的公開情況,庫可以分為兩種類型
- 開源庫 - 公開源代碼,能看到具體實(shí)現(xiàn)
比如SDWebImage、AFNetworking - 閉源庫 - 不公開源代碼,是經(jīng)過編譯后的二進(jìn)制文件,看不到具體實(shí)現(xiàn)
- 靜態(tài)庫 .a和 .framework
- 動(dòng)態(tài)庫 .dylib 和 .framework (iOS9 取消了.dylib, 使用.tbd替代)
靜態(tài)庫和動(dòng)態(tài)庫在使用上的區(qū)別
靜態(tài)庫:鏈接時(shí),靜態(tài)庫中使用的文件會(huì)被完整地復(fù)制到可執(zhí)行文件中,被多次使用就有多份冗余拷貝
動(dòng)態(tài)庫:鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個(gè)程序共用,節(jié)省內(nèi)存
需要注意的是:項(xiàng)目中如果使用了自制的動(dòng)態(tài)庫,不能被上傳到AppStore
2、靜態(tài)庫的生成&使用
注意:“Cocoa Touch Framework”模版也能生成靜態(tài)庫,用“Cocoa Touch Framework”創(chuàng)建的插件可以包含資源文件,
而“Cocoa Touch Static Library”只能包含代碼,如果想引用資源文件還得利用Bundle,
用“Cocoa Touch Static Library”創(chuàng)建插件已經(jīng)是很老的技術(shù)了,而且很繁瑣。
尋找類庫的方法
1)Show In Finder
注意
-
真機(jī)與模擬器的類庫不能混用
真機(jī)類庫與模擬器類庫 - 類庫項(xiàng)目中添加自定義頭文件時(shí),需要手動(dòng)添加其頭文件
- 類庫項(xiàng)目中添加資源文件時(shí),需要手動(dòng)添加
使用靜態(tài)庫 , 改名字后 拖入要使用的項(xiàng)目,然后導(dǎo)入頭文件調(diào)用里面的方法即可
3、同名資源處理
有時(shí)會(huì)遇到類庫中的圖片與本地項(xiàng)目中的圖片名稱相同的情況,造成圖片錯(cuò)用,為了避免發(fā)現(xiàn)同名資源沖突問題,一般將類庫中的資源文件進(jìn)行打包(將資源文件添加到自定義的Bundle中),設(shè)置包名為和類庫項(xiàng)目相關(guān)的名稱
使用時(shí),多加一層路徑
4、架構(gòu)合成
如果導(dǎo)入類庫后運(yùn)行崩潰報(bào)錯(cuò)
如果項(xiàng)目中使用類庫后,遇到形似Undefined symbols for architecture x86_64(x86_64架構(gòu)下有未定義的符號(hào))的錯(cuò)誤,則為鏈接錯(cuò)誤,該錯(cuò)誤只有兩種情況:
1> 項(xiàng)目中沒有導(dǎo)入指定的類庫
2> 項(xiàng)目中使用的類庫架構(gòu)(類庫生成的設(shè)備)和運(yùn)行項(xiàng)目的設(shè)備不同
2.架構(gòu): CPU架構(gòu),目前分兩類:
精簡指令集架構(gòu): 主要用于移動(dòng)設(shè)備,手機(jī)/平板 代表廠商: ARM IBM
復(fù)雜指令集架構(gòu): 主要用于PC 代表廠商: Intel AMD
iOS中涉及的架構(gòu):
真機(jī):
armv7 iPhone4s
armv7s iPhone5 iPhone5c
arm64/armv8 iPhone5s及以上
模擬器:
i386 iPhone4s iPhone5 iPhone5c
x86_64 iPhone5s及以上
工作中類庫給客戶使用時(shí)一般兩個(gè)配置方式:
1> 標(biāo)明不同設(shè)備類型使用類庫,讓客戶自行選取
2> 將架構(gòu)進(jìn)行合成,這樣可以讓客戶直接使用類庫,而無需考慮設(shè)備類型的問題 缺點(diǎn):APP包會(huì)比較大
3.查看類庫架構(gòu)
使用命令行工具 lipo -info .a的文件路徑
合成架構(gòu)方式
1> 方式1: 使用命令行工具 lipo -create 類庫文件1路徑 類庫文件2路徑 -output 生成類庫路徑
2> 方式2:工作中沒有那么多真機(jī), 對(duì)Xcode進(jìn)行設(shè)置,自動(dòng)生成合成架構(gòu)的類庫文件
特點(diǎn):
2.1> 設(shè)置后,只能生成真機(jī)/模擬器的類庫
2.2> 生成真機(jī)的合成架構(gòu)時(shí),默認(rèn)沒有armv7s類型的 -> 可以修改設(shè)置來添加armv7s的類庫 "添加架構(gòu)時(shí),注意需要將armv7和arm64也進(jìn)行添加"
最后、因?yàn)榉绞?只能
生成真機(jī)或者
模擬器的架構(gòu) ,所以需要方式1的方式對(duì)真機(jī)與模擬器的架構(gòu)一次進(jìn)行終極合成
,使庫在所有真機(jī)與所有的模擬器都可以使用
5、 framework動(dòng)態(tài)庫
.a靜態(tài)庫Unix推出的,幾乎是所有平臺(tái)都可以使用
.framework是Apple推出的,對(duì).a靜態(tài)庫進(jìn)行了封裝,方便使用
1.類庫項(xiàng)目中添加自定義頭文件時(shí),需要手動(dòng)添加其頭文件
2.類庫項(xiàng)目中添加資源文件時(shí),不需要
手動(dòng)添加(把資源文件拖進(jìn)類庫項(xiàng)目,就會(huì)自動(dòng)添加 區(qū)別于.a靜態(tài)庫
)
-
framework默認(rèn)生成為動(dòng)態(tài)庫
動(dòng)態(tài)鏈接報(bào)錯(cuò) -
怎么使用動(dòng)態(tài)庫
添加動(dòng)態(tài)庫 查看類庫的類型 - 終端指令 file 類庫文件路徑
-
項(xiàng)目使用的framework中包含了資源文件時(shí),需要手動(dòng)添加該framework中的資源文件
生成的時(shí)候不需要手動(dòng)導(dǎo)入,使用是需要手動(dòng)導(dǎo)入
手動(dòng)導(dǎo)入bundle -
動(dòng)態(tài)庫不能上架。修改framework的類型需要在生成類庫的項(xiàng)目中修改Xcode配置
注意:在ios8 之后,蘋果新增了embled framework 可以把動(dòng)態(tài)庫嵌入到app中,不存在被拒了。