一、靜態(tài)庫的簡介
1砾脑、什么是庫?
- 庫是程序代碼的集合艾杏,是共享程序代碼的一種方式韧衣。
- 根據(jù)源代碼的公開情況,庫可以分為兩種類型:
開源庫:
公開源代碼购桑,能看得到具體實現(xiàn)
比如:SDWebImage畅铭、AFNetworking
閉源庫:
不公開源代碼,是經(jīng)過編譯后的二進制文件勃蜘,看不到具體實現(xiàn)
主要分為:靜態(tài)庫和動態(tài)庫
2硕噩、 靜態(tài)庫和動態(tài)庫的存在形式
靜態(tài)庫:.a和.framework
動態(tài)庫:.dylib和.framework[iOS9取消了.dylib,使用.tbd替代]
3元旬、 靜態(tài)庫和動態(tài)庫在使用上的區(qū)別
- 靜態(tài)庫:鏈接時榴徐,靜態(tài)庫會被完整地賦值到可執(zhí)行文件中,*被多次使用就會有多份冗余拷貝*匀归。(如左圖)
----- 例如:兩個程序都需要分享,a需要加載.a文件耗帕,b也要加載.a文件穆端,就會造成多次加載,冗余拷貝的現(xiàn)象仿便,占內(nèi)存体啰。
動態(tài)庫:鏈接時不復制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存嗽仪,共程序調(diào)用荒勇,系統(tǒng)只加載一次,多個程序共用闻坚,節(jié)省內(nèi)存沽翔。(如右圖)
----- 例如:誰來用了,找我窿凤。
####### 需要注意的是:在iOS8之前仅偎,項目中項目中如果使用了自制的動態(tài)庫,不能上傳到AppStore ■ㄊ猓現(xiàn)在可以橘沥,大多人不知道。
4夯秃、靜態(tài)庫的好處
- 靜態(tài)庫主要作用是對核心代碼進行封裝座咆,隱藏代碼的實現(xiàn)
- 提高代碼的安全性痢艺,對公司核心機密進行保護
- 例如,公司新來了一個小王介陶,老王不想讓小王看堤舒,就對代碼進行了靜態(tài)庫的封裝,交給了小王斤蔓。對方可以用植酥,但看不到實現(xiàn)。
- 避免弦牡,代碼的誤修改-防止修改
- 相當于一個工具類的封裝--WBTools
- .a文件相當于一個底層文件(二進制文件) -- 可以作為MRC中向ARC中添加的打包文件友驮,避免報錯
二、靜態(tài)庫常見的錯誤
Undefine symbols for architecturei386/x86_64/armv7/arv7S/arm64
原因-找不到符號在xx框架上
-
解決方案:看一看是否導入了正確的框架
模擬器架構(gòu):
i386 : 32位 4s和5
x86_64: 64位 5s之后機型
真機架構(gòu):
armv7 : 32位 4s/4
armv7s: 5/5c-->這是一個失敗的架構(gòu)
arm64 : 64位 5s以后機型
架構(gòu)位數(shù)關于內(nèi)存尋址效率驾锰,位數(shù)越高卸留,效率越快。
三椭豫、利用命令來查看靜態(tài)庫架構(gòu)(-架構(gòu)的合并-)
- 1.查詢方法:找到指定的靜態(tài)庫的文件夾耻瑟,將其拖入終端,并輸入:
app$ lipo -info xxxxLib.a //查詢xxxxLib.a的架構(gòu)
*只能在64位的模擬器上運行
- 2 . 注意要點:一般SDK赏酥,對真機和模擬器的架構(gòu)做了拆分喳整,就會造成程序,在真機上能運行裸扶,在模擬器運行不了框都。在模擬器上能運行,而在真機上運行不了呵晨。如下圖:
- 3.解決真機與模擬器都能運行的方法:合成多個架構(gòu)
.創(chuàng)建靜態(tài)庫
1.例如:
1)創(chuàng)建工程項目
2)配置要導出的文件.h
3)配置靜態(tài)庫的方法-核心函數(shù)的打包
4)模擬器合并多個架構(gòu)魏保,并運行--->此步驟對真機編譯沒有影響
5)用終端查詢結(jié)果
1.Debug對結(jié)果沒有查詢影響
2.arm7s這個架構(gòu)不需要管。2014年10月份Xcode更新中摸屠,取消了默認輸出這一架構(gòu)
- 手動添加armv7s谓罗,讓真機加入7s架構(gòu)
1.選擇工程-如圖顯示
2.armv7s的添加,添加完畢后運行
3.終端查詢
- 真機加入7s架構(gòu),需要手動在Architectures中, 添加3個架構(gòu), 再次編譯.
補充1
4季二、真機與模擬器架構(gòu)的合并
- 如果文件過大不建議合成
合成代碼: lipo -create 靜態(tài)庫1.a 靜態(tài)庫2.a -output 新靜態(tài)庫名
操作如下圖所示:
5.用新合成的.a文件檩咱,替換Debug-iphoneos里的.a文件。
此時,替換完成戒傻,一個共用的靜態(tài)庫架構(gòu)税手,合并就終于完畢了。
五需纳、Release和Debug的區(qū)別
- Debug: 調(diào)試模式
- Release:發(fā)布模式 ->會去除一些系統(tǒng)的調(diào)試語句芦倒,從而使文件體積變小一丟丟 ,執(zhí)行速度也會變快一丟丟不翩。對用戶沒有明顯的感覺兵扬。
- Release版本的實現(xiàn)步驟:(如圖所示)
1.從工程中找到Edit Scheme
2.把Build Configuration 改成Release模式
3.選擇模擬器麻裳,運行一遍,Generic iOS Device 運行一遍
4.打開Show in Finder
5.檢查上級文件夾器钟,會包含Release版本
注意津坑,如果需要進行架構(gòu)合并,可以按照iOS-靜態(tài)庫(1)中的方法進行架構(gòu)合并傲霸,是一樣的疆瑰。
后面,總結(jié)的有點著急昙啄,我會慢慢完善穆役。請批評指導,虛心學習梳凛。