之前一直想要封裝一個自己積累的“工具包”斤讥,以便日后搬磚家伙齊全一些退个,但是出于”懶“進(jìn)而遲遲沒有邁出第一步;最近對支付南蓬、數(shù)據(jù)持久化纺非、動畫將進(jìn)一步學(xué)習(xí)與總結(jié)。
首先對整體的 iOS 的庫有個整體的概念:
庫是共享程序代碼的方式蓖康,一般分為靜態(tài)庫和動態(tài)庫铐炫。
靜態(tài)庫:鏈接時完整地拷貝至可執(zhí)行文件中,被多次使用就有多份冗余拷貝蒜焊〉剐牛【.a和.framework】
動態(tài)庫:鏈接時不復(fù)制,程序運(yùn)行時系統(tǒng)動態(tài)加載到內(nèi)存泳梆,供程序調(diào)用鳖悠,系統(tǒng)只加載一次榜掌,多個程序共用,節(jié)省內(nèi)存乘综≡髡耍【.dylib和.framework】
注:系統(tǒng)的.framework是動態(tài)庫,我們自己建立的.framework是靜態(tài)庫卡辰。
網(wǎng)上的相關(guān)資料有很多胞皱,主要參考進(jìn)行學(xué)習(xí),為方便記憶九妈,主要以截圖的方式進(jìn)行記錄:
在stackoverflow上找到關(guān)于Link binary 和 Embeb Framework 的區(qū)別,感覺原文更直接晶疼,就直接復(fù)制過過來了酒贬;
??http://stackoverflow.com/questions/27015154/link-binary-with-libraries-vs-embed-frameworks
Link?binary with libraries Linkframeworks and libraries with your project’s object files to produce a binaryfile. You can link a target’s source files against libraries in the target’sactive SDK or against external libraries.
Embed?Frameworks You can create an embedded framework to share code between your app extension andits containing app.
制作通用動態(tài)庫,這一塊目前還沒有完全理解翠霍,先記錄一下流程锭吨,
新建Aggregate Target
添加script到新建的Target
# Sets the target folders and the final framework product.
# 如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME
# 例如: FMK_NAME = "MyFramework"
FMK_NAME=${PROJECT_NAME}
# Install dir will be the final output to the framework.
# The following line create it in the root folder of the current project.
INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework
# Working dir will be deleted after the framework creation.
WRK_DIR=build
DEVICE_DIR=${WRK_DIR}/Release-iphoneos/${FMK_NAME}.framework
SIMULATOR_DIR=${WRK_DIR}/Release-iphonesimulator/${FMK_NAME}.framework
# -configuration ${CONFIGURATION}
# Clean and Building both architectures.
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphoneos clean build
xcodebuild -configuration "Release" -target "${FMK_NAME}" -sdk iphonesimulator clean build
# Cleaning the oldest.
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# Uses the Lipo Tool to merge both binary files (i386 + armv6/armv7) into one Universal final product.
lipo -create "${DEVICE_DIR}/${FMK_NAME}" "${SIMULATOR_DIR}/${FMK_NAME}" -output "${INSTALL_DIR}/${FMK_NAME}"
rm -r "${WRK_DIR}"
open "${INSTALL_DIR}"
選中新建的Target壶运,Run, 如果沒有異常的話耐齐,會自動彈出生成的Framework文件
這樣生成的動態(tài)庫就能同時支持模擬器和真機(jī)了
xCode6下制作通用靜態(tài)庫
上面我們也提到了浪秘,這樣生成的動態(tài)庫恐怕很難在xCode5上使用蒋情,那我們?yōu)槭裁捶且脛討B(tài)庫呢,一般情況下不是用靜態(tài)庫就好了嗎耸携? So Easy!只需要修改一個參數(shù)即可生成靜態(tài)庫了
使用靜態(tài)庫的話棵癣,就可以把Framework從‘Embedded Binaries’中刪除了. 親測在xCode5下可用。把新生成的庫導(dǎo)入到測試工程夺衍,試試在模擬器和真機(jī)上運(yùn)行狈谊,一切OK.
不巧,如果你用的真機(jī)是iPhone5 C, 那悲劇又要發(fā)成了沟沙,生成的Framework竟然不支持armv7s,不知是xCode6的bug河劝,還是因為蘋果認(rèn)為使用armv7s的設(shè)備太少,可以不支持了.xCode6新建工程矛紫,默認(rèn)的Architectures竟然不包含armv7s
想要生成的庫支持armv7s,把a(bǔ)rmv7s添加到Architectures中赎瞎,重新生成Framework即可
判斷一個Framework支持哪些架構(gòu)
我們該怎么驗證生成的Framework支持哪些平臺呢,總不能一個個測試吧颊咬?當(dāng)然不用.下面的命令是加上armv7s前后生成的framework的對比
Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework
Architectures in the fat file: ./MyFramework.framework/MyFramework are: i386 x86_64 armv7 arm64
Yearsdembp:Products Years$ lipo -info ./MyFramework.framework/MyFramework
Architectures in the fat file: ./MyFramework.framework/MyFramework are: armv7 armv7s i386 x86_64 arm64
1注意理解:無論是.a靜態(tài)庫還.framework靜態(tài)庫务甥,我們需要的都是二進(jìn)制文件+.h+其它資源文件的形式牡辽,不同的是,.a本身就是二進(jìn)制文件敞临,需要我們自己配上.h和其它文件才能使用态辛,而.framework本身已經(jīng)包含了.h和其它文件,可以直接使用挺尿。
2圖片資源的處理:兩種靜態(tài)庫奏黑,一般都是把圖片文件單獨(dú)的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同编矾。.bundle文件很好弄攀涵,新建一個文件夾,把它改名為.bundle就可以了洽沟,右鍵以故,顯示包內(nèi)容可以向其中添加圖片資源。
3 category是我們實際開發(fā)項目中經(jīng)常用到的裆操,把category打成靜態(tài)庫是沒有問題的怒详,但是在用這個靜態(tài)庫的工程中,調(diào)用category中的方法時會有找不到該方法的運(yùn)行時錯誤(selector not recognized)踪区,解決辦法是:在使用靜態(tài)庫的工程中配置other
linker flags的值為-ObjC 昆烁。(注:一些第三方庫里對系統(tǒng)庫的類加了category;這時缎岗,就需要使用編譯參數(shù):-ObjC静尼,這樣第三方庫中對系統(tǒng)類作的擴(kuò)展方法才能在工程中使用)
4如果一個靜態(tài)庫很復(fù)雜,需要暴露的.h比較多的話传泊,就可以在靜態(tài)庫的內(nèi)部創(chuàng)建一個.h文件(一般這個.h文件的名字和靜態(tài)庫的名字相同)鼠渺,然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了眷细,只需要把.h暴露出來就可以了拦盹。
接下來對github的本地倉庫與遠(yuǎn)程倉庫進(jìn)行總結(jié),代碼總的有個歸宿溪椎。。沼侣。歉秫。利人利己
更多精彩內(nèi)容請關(guān)注“IT實戰(zhàn)聯(lián)盟”哦~~~
