在項(xiàng)目開(kāi)發(fā)過(guò)程中,經(jīng)常出現(xiàn)優(yōu)秀代碼重用現(xiàn)象,又或者提供給第三方功能模塊卻又不想讓其看到源代碼,這些時(shí)候,通常的做法是將代碼封裝成庫(kù)或者框架,這些在Windows編程或Linux編程中非常容易實(shí)現(xiàn)的過(guò)程,在iOS開(kāi)發(fā)中卻遇到了麻煩,原因是:蘋(píng)果公司禁止在iOS開(kāi)發(fā)中使用動(dòng)態(tài)庫(kù)(而蘋(píng)果自己卻可以使用動(dòng)態(tài)庫(kù)),同時(shí),蘋(píng)果也從Xcode中移除了創(chuàng)建靜態(tài)框架的功能。值得慶幸的是我們可以通過(guò)對(duì)Xcode進(jìn)行小小的改動(dòng)來(lái)創(chuàng)建靜態(tài)框架,而靜態(tài)庫(kù)和靜態(tài)框架是被App Store所允許的,其實(shí)靜態(tài)框架本質(zhì)上說(shuō)也是靜態(tài)庫(kù)的一種。
在正式的上代碼之前,先介紹一些從網(wǎng)上搜集的靜態(tài)庫(kù)相關(guān)的基本概念,以加深對(duì)后面知識(shí)的理解 1. 庫(kù) 庫(kù)實(shí)際上是一種代碼共享的方式,主要用于代碼重用和源碼隱藏,通常分為動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)。 2. 區(qū)別 靜態(tài)庫(kù):鏈接時(shí)完整的拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝。 動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個(gè)程序共用,節(jié)省內(nèi)存空間。 3. iOS中靜態(tài)庫(kù)的形式 在iOS中靜態(tài)庫(kù)以.a和.framework的形式存在,動(dòng)態(tài)庫(kù)以.dylib和.framework的形式存在。 之所以.framework既可能是動(dòng)態(tài)庫(kù)又可能是靜態(tài)庫(kù),是因?yàn)樘O(píng)果公司禁止用戶級(jí)App使用動(dòng)態(tài)庫(kù),而自己卻又堂而皇之的使用動(dòng)態(tài)庫(kù),這就造成了iOS中系統(tǒng)級(jí)的.framework是動(dòng)態(tài)庫(kù),用戶級(jí)的.framework是靜態(tài)庫(kù)(無(wú)可奈何?。?/span> 4. .a與.framework的區(qū)別 二者區(qū)別不大,.a是純二進(jìn)制文件,.a文件不能單獨(dú)使用,至少要有.h文件配合,而.framework除了二進(jìn)制文件外,還包含一些資源文件(頭文件,plist等),由于自身包含了頭文件,所以.framework可以單獨(dú)使用。 5. 靜態(tài)庫(kù)使用的必要性 1>. 代碼的共享與重用 2>. 程序模塊化 3>. 分享給別人代碼庫(kù)時(shí)代碼隱藏 4>. 開(kāi)發(fā)第三方SDK 6. 對(duì)圖片資源和UI界面xib或nib文件的處理 .a和.framework兩種靜態(tài)庫(kù),通常都是把需要用的到圖片或者xib文件存放在一個(gè)bundle文件中,而該bundle文件的名字和.a或.framework的名字相同。關(guān)于bundle文件的制作方法,后面有專門介紹。 有個(gè)疑問(wèn): .a文件中無(wú)法存放圖片或xib文件,很容易理解,但是.framework從本質(zhì)上說(shuō)也是一個(gè)bundle文件,為什么不把圖片或者xib文件直接放在.framework中而單獨(dú)再創(chuàng)建個(gè)bundle文件呢? 那是因?yàn)閕OS系統(tǒng)不會(huì)去掃描.framework下的圖片等資源文件,也不會(huì)在項(xiàng)目中顯示,也就是說(shuō)即使放在.framework目錄下,系統(tǒng)根本就不會(huì)去掃描,因此也無(wú)法發(fā)現(xiàn)使用。 7. category的處理 category是項(xiàng)目開(kāi)發(fā)中經(jīng)常用到的,把category打包成靜態(tài)庫(kù)是沒(méi)有問(wèn)題的,但是在使用這個(gè)靜態(tài)庫(kù)時(shí),調(diào)用category中的方法時(shí)會(huì)發(fā)生找不到該方法的運(yùn)行時(shí)錯(cuò)誤(selector not recognized),解決的辦法是在使用靜態(tài)庫(kù)的工程中配置other linker flags的值為 -ObjC -all_load |
|