發(fā)布時(shí)間:2023-11-27 17:47:35 瀏覽量:118次
一、概念
靜態(tài)庫(kù):以.a 和 .framework為文件后綴名。
動(dòng)態(tài)庫(kù):以.tbd(之前叫.dylib) 和 .framework 為文件后綴名。
二、區(qū)別
靜態(tài)庫(kù):鏈接時(shí)會(huì)被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份拷貝。
動(dòng)態(tài)庫(kù):鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,系統(tǒng)只加載一次,多個(gè)程序共用(如系統(tǒng)的UIKit.framework等),節(jié)省內(nèi)存。
注意:但是蘋(píng)果不讓使用自己的動(dòng)態(tài)庫(kù),否則審核就無(wú)法通過(guò)。所有我們制作SDK通常都是指靜態(tài)庫(kù)
注意點(diǎn)
1、項(xiàng)目名、里面的各種類(lèi)名、文件名和方法名最好都 帶上自己的前綴。
2、SDK的文件分層要以模塊和功能進(jìn)行劃分。
3、在進(jìn)行資源操作如圖片加載、文件讀取時(shí),要對(duì)對(duì)應(yīng)的方法進(jìn)行封裝處理,方便對(duì)資源的統(tǒng)一處理,如對(duì)UIImageView 設(shè)置圖片的方法進(jìn)行二次封裝。
4、能不使用第三方類(lèi)庫(kù)就不使用,假如真的需要就最好是對(duì)第三方類(lèi)庫(kù)進(jìn)行重命名和方法名修改,以防止SDK使用方的項(xiàng)目中類(lèi)庫(kù)文件和方法沖突。
5、要對(duì)SDK中需要用到的依賴(lài)文件進(jìn)行記錄以方便做文檔。
6、SDK中盡量不要使用分類(lèi)Category,因?yàn)闀?huì)涉及到一個(gè)資源加載的問(wèn)題,會(huì)使得SDK包變大。使用起來(lái)當(dāng)然也是沒(méi)有任何問(wèn)題,只需要添加-all_load或-ObjC就可以。
7、制作的SDK需要注意debug模式和Realease模式,debug模式只是一般的測(cè)試,Realease才可進(jìn)行上商店。
關(guān)于-ObjC
這個(gè)flag告訴鏈接器把庫(kù)中定義的Objective-C類(lèi)和Category都加載進(jìn)來(lái),這樣編譯之后的app會(huì)變大(因?yàn)榧虞d了其他的objc代碼進(jìn)來(lái))但是如果靜態(tài)庫(kù)中有類(lèi)和category的話只有加入這個(gè)flag才行
關(guān)于-all_load
這個(gè)flag是專(zhuān)門(mén)處理-ObjC的一個(gè)bug的。用了-ObjC以后,如果類(lèi)庫(kù)中只有category沒(méi)有類(lèi)的時(shí)候這些category還是加載不進(jìn)來(lái)。變通方法就是加入-all_load或者-force-load。-all_load會(huì)強(qiáng)制鏈接器把目標(biāo)文件都加載進(jìn)來(lái),即使沒(méi)有objc代碼。-force_load在xcode3.2后可用。但是-force_load后面必須跟一個(gè)只想靜態(tài)庫(kù)的路徑。
關(guān)于-force_load
如果有多個(gè)三方庫(kù),有的需要加,有的不需要,用-all_load到最后duplicate symbol錯(cuò)誤此時(shí)可以用-force_load + 路徑方式
1、SDK庫(kù)的含義:
共享程序代碼的方式,可以對(duì)自己的項(xiàng)目進(jìn)行封裝,生成庫(kù),方便別人的使用。
2、SDK庫(kù)的分類(lèi):
A、靜態(tài)庫(kù),鏈接時(shí)完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝。
B、動(dòng)態(tài)庫(kù),鏈接時(shí)不拷貝,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,供程序調(diào)用,系統(tǒng)只加載一次,多個(gè)程序共用,節(jié)省內(nèi)存。
3、SDK庫(kù)的形式:
A、.a與.framework文件是靜態(tài)庫(kù)(.framework屬于自己創(chuàng)建),自己創(chuàng)建的.framework是靜態(tài)庫(kù)文件。
B、.tbd(Xcode7和iOS9 之前是.dylib文件)與.framework文件是動(dòng)態(tài)庫(kù)(.framework屬于系統(tǒng)自帶),系統(tǒng)自帶的.framework是動(dòng)態(tài)庫(kù)文件。
4、靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別:
《1》.a是一個(gè)純二進(jìn)制文件,不能直接使用,至少要有.h文件配合
《2》.framework中除了有二進(jìn)制文件之外還有資源文件,可以直接使用。
.framework = .a(二進(jìn)制文件) + .h (頭文件) + resourceFile (資源文件)
5、靜態(tài)庫(kù)的使用優(yōu)點(diǎn):
《1》方便程序共享代碼,便于合理規(guī)范使用。
《2》 可以實(shí)現(xiàn)iOS程序的模塊化,可以把固定的業(yè)務(wù)模塊化成靜態(tài)庫(kù)。
《3》能夠與別人分享你的代碼庫(kù),但又不想讓別人看到你代碼如何實(shí)現(xiàn)。
《4》開(kāi)發(fā)第三方SDK的業(yè)務(wù)模塊需求。
6、靜態(tài)庫(kù)的制作的注意點(diǎn):
《1》.a是二進(jìn)制文件,需要配合.h頭文件和其它文件才能使用,.framework可以直接使用。
《2》圖片資源的處理可以使用.bundle文件,.bundle文件的名字和.a或.framework的名字相同。
《3》.bundle文件的簡(jiǎn)單制作如下:
首先,新建一個(gè)文件夾;
其次,修改文件夾的后綴名為.bundle ;
最后,點(diǎn)擊右鍵,打開(kāi)顯示包內(nèi)容,就可以向其中添加圖片資源。
《4》category文件打包成靜態(tài)庫(kù)文件再添加到工程,調(diào)用分類(lèi)方法時(shí)會(huì)有找不到該方法的運(yùn)行時(shí)錯(cuò)誤(selector not recognized),解決辦法就是在靜態(tài)庫(kù)的工程中配置other linker flags的值為-ObjC。
《5》如果靜態(tài)庫(kù)很復(fù)雜,需要暴露的.h頭文件比較多,可以在靜態(tài)庫(kù)內(nèi)部創(chuàng)建一個(gè).h文件(一般這個(gè).h文件的名字和靜態(tài)庫(kù)的名字相同),然后把需要暴露的.h頭文件顯示,不需要暴露的.h頭文件集中放在這個(gè)內(nèi)部創(chuàng)建的.h文件。
7、創(chuàng)建.a靜態(tài)庫(kù)文件流程如下:
《1》創(chuàng)建一個(gè).a靜態(tài)庫(kù)工程
Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Static Library ——》命名項(xiàng)目工程 ——》保存目錄
《2》一個(gè)靜態(tài)庫(kù)工程由頭文件和實(shí)現(xiàn)文件組成(TestSDK.h和TestSDK.m),這些文件將被編譯為庫(kù)本身。由于不需要實(shí)現(xiàn)文件,需要右鍵單擊TestSDK.m刪除該文件并移動(dòng)到廢紙簍。
《3》創(chuàng)建一個(gè)自己封裝的控件,然后拷貝到Xcode項(xiàng)目工程目錄里面。注意拷貝的時(shí)候,要勾選3個(gè)選項(xiàng),Copy items id needed、 Create groups和TestSDK。
《4》添加控件的.h頭文件到庫(kù)的主頭文件TestSDK.h中
《5》生成靜態(tài)庫(kù)的形式:
A、模擬器,只有在模擬器才能編譯運(yùn)行
Build only Device ——》show in Finder ——》拿到模擬器的.a二進(jìn)制文件和其它所有的.h頭文件
B、真機(jī),只有在手機(jī)端才能編譯運(yùn)行
iOS Simulators ——》show in Finder ——》拿到真機(jī)的.a二進(jìn)制文件和其它所有的.h頭文件
《6》合成真機(jī)與模擬器.a文件,這樣可以在真機(jī)和模擬器都能夠編譯運(yùn)行,終端命令如下:
lipo -create
模擬器.a文件目錄
真機(jī).a文件目錄
-output 輸出目錄/TestSDk.a, 獲取的TestSDk.a文件兼容模擬器和真機(jī)的二進(jìn)制文件。
8、創(chuàng)建.framework靜態(tài)庫(kù)文件流程如下:
《1》創(chuàng)建一個(gè).framework靜態(tài)庫(kù)工程
Xcode ——》File\New\Project ——》iOS\Framework and Library\Cocoa Touch Framework ——》命名項(xiàng)目工程 ——》保存目錄
《2》創(chuàng)建兩個(gè)新的工具類(lèi),或者向項(xiàng)目工程拖入一個(gè)相對(duì)完整的功能模塊。
《3》在項(xiàng)目工程中添加所依賴(lài)的框架
Xcode ——》Project ——》Targets ——》Build Phases ——》Link Binary With Libraries
《4》在項(xiàng)目工程中設(shè)置要暴露的頭文件接口,設(shè)置Public和Private,選擇相應(yīng)的運(yùn)行設(shè)備。
Xcode ——》Project ——》Targets ——》Build Phases ——》Headers
《5》在項(xiàng)目工程中添加腳本
Xcode ——》Project ——》Targets ——》Build Phases ——》New Run Script Phase ——》 添加shell腳本
加入下面的腳本將模擬器和真機(jī)的Framework合并,如下所示:
if [ "${ACTION}" = "build" ]
then
INSTALL_DIR=${SRCROOT}/Products/${PROJECT_NAME}.framework
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
#ditto "${DEVICE_DIR}/Headers" "${INSTALL_DIR}/Headers"
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#open "${DEVICE_DIR}"
open "${SRCROOT}/Products"
fi
《6》點(diǎn)擊Xcode左上角的運(yùn)行按鈕,然后腳本就自動(dòng)彈出生成的Framework庫(kù)文件。
《7》如果其他項(xiàng)目工程導(dǎo)入這個(gè)Framework庫(kù),編譯報(bào)錯(cuò),需要讓編譯器提前編譯這個(gè)二進(jìn)制文件,做法是Xcode->General->Embedded Binaries,將系統(tǒng)依賴(lài)的Framework添加上去即可。
《8》最后,F(xiàn)ramework的核心在于內(nèi)部結(jié)構(gòu)的設(shè)計(jì),謹(jǐn)慎設(shè)計(jì)你的每一個(gè)接口,在每個(gè)對(duì)外暴露的方法中需要做好注釋?zhuān)欢环萃ㄓ玫慕涌谖臋n也是必須的。
熱門(mén)資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢(xún)報(bào)名。
2. 手機(jī)游戲如何開(kāi)發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說(shuō)明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動(dòng)化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白。快來(lái)試試!
4. Steam值得入手的武俠游戲盤(pán)點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個(gè)抉定都將觸發(fā)更多愛(ài)恨糾葛的精彩奇遇?!短烀嬗肪哂卸嗑€劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動(dòng)
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動(dòng)漫建模全過(guò)程,不是一般人能學(xué)的會(huì)的,會(huì)的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫(huà)的形式。像往常一樣,我從Sphere創(chuàng)建它...
7. 3D動(dòng)畫(huà)軟件你知道幾個(gè)?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動(dòng)畫(huà)軟件或動(dòng)畫(huà)工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動(dòng)畫(huà)的軟件程序。但是,在3D動(dòng)畫(huà)軟件中還包含了其他類(lèi)型的...
8. 開(kāi)發(fā)三昧游戲叫什么(三昧動(dòng)漫)
?三昧動(dòng)漫對(duì)于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會(huì)推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
9. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
10. Unity3D入門(mén):手把手帶你開(kāi)發(fā)一款坦克大戰(zhàn)的游戲
Unity工程創(chuàng)建完成后如圖所示: 接下來(lái)應(yīng)該導(dǎo)入此項(xiàng)目所需的Unity Package文件,要用到的Unity package文件大家可以去Unity3D的官方網(wǎng)站下載(地址:ht...
最新文章
同學(xué)您好!