簡(jiǎn)介
什么是庫(kù)系忙?
庫(kù)是程序代碼的集合诵盼,是共享程序代碼的一種方式
根據(jù)源代碼的公開(kāi)情況,庫(kù)可以分為2種類(lèi)型
開(kāi)源庫(kù)
公開(kāi)源代碼银还,能看到具體實(shí)現(xiàn)
比如SDWebImage风宁、AFNetworking
閉源庫(kù)
不公開(kāi)源代碼,是經(jīng)過(guò)編譯后的二進(jìn)制文件蛹疯,看不到具體實(shí)現(xiàn)
主要分為:靜態(tài)庫(kù)戒财、動(dòng)態(tài)庫(kù)
.a的制作
如果想讓一個(gè).a文件能同時(shí)用在真機(jī)和模擬器上,需要進(jìn)行合并
在終端輸入指令
lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a
藍(lán)色部分是固定指令
紅色捺弦、紫色是真機(jī)和模擬器.a文件的路徑
綠色是所合成.a文件的路徑
.a文件的體積(一般情況下)
真機(jī)用的.a > 模擬器用的.a
所合成.a == 真機(jī)用的.a
- 模擬器用的.a
通過(guò)lipo –info libMJRefresh.a可以查看 .a 的類(lèi)型(模擬器還是真機(jī))
模板制作.framework
? 手工制作 .framework 過(guò)于復(fù)雜饮寞,借助開(kāi)源模板進(jìn)行制作會(huì)比較簡(jiǎn)單
? 模板地址
? https://github.com/kstenerud/iOS-Universal-Framework
? 安裝模板
? 在終端下進(jìn)入iOS-Universal-Framework/Fake Framework文件夾
? 執(zhí)行指令./install.sh
制作靜態(tài)庫(kù)的注意點(diǎn)
無(wú)論是 .a 靜態(tài)庫(kù)還是 .framework 靜態(tài)庫(kù),最終需要的都是:
二進(jìn)制文件 + .h + 其它資源文件
.a 和 .framework 的使用區(qū)別
.a 本身是一個(gè)二進(jìn)制文件羹呵,需要配上 .h 和 其它資源文件 才能使用
.framework 本身已經(jīng)包含了 .h 和 其它資源文件骂际,可以直接使用
圖片資源的處理
如果靜態(tài)庫(kù)中用到了圖片資源疗琉,一般都放到一個(gè)bundle文件中冈欢,bundle名字一般跟 .a 或 .framework 名字一致
bundle的創(chuàng)建:新建一個(gè)文件夾,修改擴(kuò)展名為.bundle 即可盈简,右擊bundle文件凑耻,顯示包內(nèi)容太示,就可以往bundle文件中放東西
制作靜態(tài)庫(kù)的注意點(diǎn)
多文件處理
如果靜態(tài)庫(kù)需要暴露出來(lái)的 .h 比較多,可以考慮創(chuàng)建一個(gè)主頭文件
(一般 主頭文件 和 靜態(tài)庫(kù) 同名)
在主頭文件中包含所有其他需要暴露出來(lái)的 .h 文件
使用靜態(tài)庫(kù)時(shí)香浩,只需要#import 主頭文件
實(shí)際上蘋(píng)果官方就是這么做的类缤,例如:#import <UIKit/UIKit.h>
.framework為什么既是靜態(tài)庫(kù)又是動(dòng)態(tài)庫(kù)
系統(tǒng)的 .framework 是動(dòng)態(tài)庫(kù)
我們自己建立的 .framework 是靜態(tài)庫(kù)
靜態(tài)庫(kù)
- 靜態(tài)庫(kù)簡(jiǎn)介
1.什么是庫(kù)?
就是程序代碼的集合, 是共享程序代碼的一種方式
2.庫(kù)的分類(lèi)?
開(kāi)源庫(kù)
公開(kāi)源代碼, 能看到具體實(shí)現(xiàn)
例如MJExtension, MJRefresh, AFNetworking...
閉源庫(kù)
不公開(kāi)源代碼, 是經(jīng)過(guò)編譯后的二進(jìn)制文件, 看不到具體實(shí)現(xiàn)
主要分為: 靜態(tài)庫(kù)
和 動(dòng)態(tài)庫(kù)
3.靜態(tài)庫(kù)的存在形式
.a
.framework
靜態(tài)庫(kù)的存在形式
.dylib
.framework
5.靜態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別?
靜態(tài)庫(kù)在鏈接時(shí),
會(huì)被完整的復(fù)制到可執(zhí)行文件中; 被多次使用, 就有多份拷貝;
動(dòng)態(tài)庫(kù)則不會(huì)復(fù)制,
只有一份. 程序運(yùn)行時(shí)動(dòng)態(tài)加載到內(nèi)存; 系統(tǒng)只加載一次, 多個(gè)程序共用, 節(jié)省內(nèi)存;
但是!!!!
項(xiàng)目中如果使用到自己的動(dòng)態(tài)庫(kù), 不允許上架!
6.靜態(tài)庫(kù)應(yīng)用場(chǎng)景?
保護(hù)自己的核心代碼
將MRC的項(xiàng)目,打包成靜態(tài)庫(kù),
可以在ARC下直接使用, 不需要轉(zhuǎn)換
注意:Xcode6以前是沒(méi)有Cocoa Touch Framework這個(gè)選項(xiàng)的
1.都是利用第三方框架
- 靜態(tài)庫(kù)的制作
1.創(chuàng)建項(xiàng)目時(shí), 直接選擇靜態(tài)庫(kù)
2.設(shè)置需要暴漏的頭文件
3.在模擬器環(huán)境下編譯(得到模擬器環(huán)境下的靜態(tài)庫(kù))
4.在真機(jī)環(huán)境下編譯(得到真機(jī)環(huán)境下的靜態(tài)庫(kù))
5.注意事項(xiàng):
模擬器下的靜態(tài)庫(kù)和真機(jī)下的靜態(tài)庫(kù)不能共用
6.注意靜態(tài)庫(kù)所支持的架構(gòu)
不同機(jī)型的CPU, 對(duì)應(yīng)的架構(gòu)不同; 模擬器: 4s----5 : i386
5s----6sPlus : x86_64
真機(jī): 3gs---4s : armv7
5/5c :
armv7s(armv7兼容armv7s)
5s---6sPlus: arm64
查看靜態(tài)庫(kù)支持的架構(gòu)lipo -info 庫(kù)文件
解決方案: Build Settings -> Build Active
7.合并靜態(tài)庫(kù)(模擬器和真機(jī)都支持)
lipo
-create 庫(kù)1 庫(kù)2 -output 終極庫(kù)
注意點(diǎn):合并后的靜態(tài)庫(kù)文件比較大(真機(jī)靜態(tài)庫(kù) + 模擬器靜態(tài)庫(kù))
8.Debug版本和Release版本
區(qū)別:
1.vs中的程序有debug和release兩個(gè)版本,Debug通常稱(chēng)為調(diào)試版本邻吭,通過(guò)一系列編譯選項(xiàng)的配合餐弱,編譯的結(jié)果通常包含調(diào)試信息,而且不做任何優(yōu)化囱晴,以為開(kāi)發(fā) 人員提供強(qiáng)大的應(yīng)用程序調(diào)試能力膏蚓。而Release通常稱(chēng)為發(fā)布版本,是為用戶(hù)使用的畸写,一般客戶(hù)不允許在發(fā)布版本上進(jìn)行調(diào)試驮瞧。所以不保存調(diào)試信
息,同時(shí)枯芬,它往往進(jìn)行了各種優(yōu)化论笔,以期達(dá)到代碼最小和速度最優(yōu)。為用戶(hù)的使用提供便利千所。
2.debug程序通常比release程序要慢狂魔,尤其是處理視頻方便release要比debug快很多。在release模式對(duì)程序進(jìn)行調(diào)試的時(shí)候經(jīng)常會(huì)遇到變量雖然初始化了淫痰,但是在查看其值的時(shí)候卻發(fā)現(xiàn)是一個(gè)隨機(jī)的數(shù)并不是初始化的值毅臊,有時(shí)候在對(duì)變量進(jìn)行監(jiān)視的時(shí)候了,會(huì)出現(xiàn)找不到變量的情況黑界,原因大致如下:
3.debug跟release在初始化變量時(shí)所做的操作是不同的管嬉,debug是將每個(gè)字節(jié)位都賦成0xcc, 而release的賦值近似于隨機(jī)朗鸠。如果你的程序中的某個(gè)變量沒(méi)被初始化就被引用蚯撩,就很有可能出現(xiàn)異常:用作控制變量將導(dǎo)致流程導(dǎo)向不一致;用作數(shù)組下標(biāo)將會(huì)使程序崩潰烛占;更加可能是造成其他變量的不準(zhǔn)確而引起其他的錯(cuò)誤胎挎。所以在聲明變量后馬上對(duì)其初始化一個(gè)默認(rèn)的值是最簡(jiǎn)單有效的辦法,否則項(xiàng)目大了你找都沒(méi)地方找忆家。代碼存在錯(cuò)誤在debug方式下可能會(huì)忽略而不被察覺(jué)到犹菇。debug方式下數(shù)組越界也大多不會(huì)出錯(cuò),在release中就暴露出來(lái)了芽卿,這個(gè)找起來(lái)就比較難了揭芍。
4.只有DEBUG版的程序才能設(shè)置斷點(diǎn)、單步執(zhí)行卸例、使用
TRACE/ASSERT等調(diào)試輸出語(yǔ)句称杨。REALEASE不包含任何調(diào)試信息肌毅,所以體積小、運(yùn)行速度快姑原。
修改方案:
Edit Scheme
9.真正開(kāi)發(fā)中的靜態(tài)庫(kù)制作
建立一個(gè)項(xiàng)目, 在項(xiàng)目中, 創(chuàng)建一個(gè)靜態(tài)庫(kù); 好處: 可以調(diào)試靜態(tài)庫(kù)
framework 靜態(tài)庫(kù)制作
通靜態(tài)庫(kù)制造方法一致
默認(rèn)情況下, 制作的是動(dòng)態(tài)庫(kù)
變成靜態(tài)庫(kù)
b s -> match
***********************黑馬*********************
- 為什么要做靜態(tài)庫(kù)
================================================================================
1>
國(guó)內(nèi)的企業(yè)悬而,掌握有核心技術(shù),同時(shí)是又希望更多的程序員來(lái)使用其技術(shù)锭汛,因此采用"閉源"的方式開(kāi)發(fā)使用
例如:百度地圖笨奠,友盟,JPush等
2>
在企業(yè)開(kāi)發(fā)中唤殴,一些核心技術(shù)或者常用框架艰躺,出于安全性和穩(wěn)定性的考慮,也會(huì)提供靜態(tài)庫(kù)給程序員使用
- 靜態(tài)庫(kù)的特點(diǎn)
================================================================================
.a + .h
- 靜態(tài)庫(kù)簡(jiǎn)單演練
================================================================================
1>
新建CZTools項(xiàng)目
2>
創(chuàng)建一個(gè)類(lèi)方法眨八,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的加法
3>
編譯
注意腺兴,在編譯靜態(tài)庫(kù)時(shí),需要編譯兩個(gè)版本 ->
真機(jī)(arm) | 模擬器(i386)
4>
新建項(xiàng)目將編譯生成的.a + .h拖到項(xiàng)目中使用
- 靜態(tài)庫(kù)中的資源包的使用
================================================================================
問(wèn)題:有些第三方庫(kù)會(huì)使用到一些圖片素材廉侧,例如公司的logo等页响。
但是由于Xcode默認(rèn)在編譯時(shí)會(huì)把所有的素材文件導(dǎo)入到mainBundle中,為了避免與使用靜態(tài)庫(kù)的程序沖突段誊。
在靜態(tài)庫(kù)中如果要使用圖片素材闰蚕,會(huì)創(chuàng)建一個(gè)文件后綴自行改為.bundle
1>
建立bundle,并且向其中添加圖片
2>
創(chuàng)建一個(gè)類(lèi)方法连舍,返回圖片
3>
編譯
4>
調(diào)用方如果需要使用没陡,需要導(dǎo)入.h + .a + XXX.bundle
- 靜態(tài)庫(kù)中的自定義視圖
================================================================================
問(wèn)題:程序需要測(cè)試
靜態(tài)庫(kù)如何測(cè)試呢?
創(chuàng)建復(fù)合項(xiàng)目
1>
復(fù)習(xí)塊代碼傳值
- 靜態(tài)庫(kù)的使用
================================================================================
新建項(xiàng)目將編譯生成的.a + .h拖到項(xiàng)目中使用
- 靜態(tài)庫(kù)的種類(lèi)
================================================================================
靜態(tài)庫(kù)文件的版本(4種)
1.真機(jī)-Debug版本
2.真機(jī)-Release版本
3.模擬器-Debug版本
4.模擬器-Release版本
調(diào)試版本VS 發(fā)布版本
調(diào)試版本會(huì)包含完整的符號(hào)信息索赏,以方便調(diào)試
調(diào)試版本不會(huì)對(duì)代碼進(jìn)行優(yōu)化
發(fā)布版本不會(huì)包含完整的符號(hào)信息
發(fā)布版本的執(zhí)行代碼是進(jìn)行過(guò)優(yōu)化的
發(fā)布版本的大小會(huì)比調(diào)試版本的略小
在執(zhí)行速度方面盼玄,發(fā)布版本會(huì)更快些,但不意味著會(huì)有顯著的提升
- 靜態(tài)庫(kù)的合并
================================================================================
檢測(cè).a的類(lèi)型
$ lipo -info
libCZTools.a
合并.a
lipo -create
Debug-iphoneos/libCZTools.a Debug-iphonesimulator/libCZTools.a -output
libCZTools.a
合并.a的好處潜腻,開(kāi)發(fā)過(guò)程中既可以在真機(jī)上調(diào)試埃儿,也可以在模擬器上調(diào)試
合并.a的壞處,如果靜態(tài)庫(kù)太大融涣,合并打包后童番,會(huì)非常大,因此很多第三方的靜態(tài)庫(kù)的.a是區(qū)分版本的
今后在使用.a時(shí)一定注意版本