靜態(tài)庫的封裝注意點(diǎn)及架構(gòu)合成

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 Static Library舉例
注意:“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

尋找類庫的方法

注意

  1. 真機(jī)與模擬器的類庫不能混用


    真機(jī)類庫與模擬器類庫
  2. 類庫項(xiàng)目中添加自定義頭文件時(shí),需要手動(dòng)添加其頭文件
  3. 類庫項(xiàng)目中添加資源文件時(shí),需要手動(dòng)添加
類庫中添加自定義頭文件或圖片需要手動(dòng)添加

使用靜態(tài)庫 , 改名字后 拖入要使用的項(xiàng)目,然后導(dǎo)入頭文件調(diào)用里面的方法即可


導(dǎo)入項(xiàng)目

3、同名資源處理

有時(shí)會(huì)遇到類庫中的圖片與本地項(xiàng)目中的圖片名稱相同的情況,造成圖片錯(cuò)用,為了避免發(fā)現(xiàn)同名資源沖突問題,一般將類庫中的資源文件進(jìn)行打包(將資源文件添加到自定義的Bundle中),設(shè)置包名為和類庫項(xiàng)目相關(guān)的名稱

對(duì)圖片打包

使用時(shí),多加一層路徑


避免重名

4、架構(gòu)合成

如果導(dǎo)入類庫后運(yùn)行崩潰報(bào)錯(cuò)


崩潰報(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)的類庫文件


生成真機(jī)除armv7s或者模擬器所有的架構(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)行添加"


手動(dòng)添加所有的架構(gòu)

最后、因?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中,不存在被拒了。
    
更改.framework為靜態(tài)類型

現(xiàn)在就可以按靜態(tài)庫的使用方式使用.framework庫了,架構(gòu)的合成與.a也是一樣的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容