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