之前一直想要封裝一個自己積累的“工具包”,以便日后搬磚家伙齊全一些,但是出于”懶“進而遲遲沒有邁出第一步;最近對支付、數據持久化、動畫將進一步學習與總結。
首先對整體的 iOS 的庫有個整體的概念:
庫是共享程序代碼的方式,一般分為靜態庫和動態庫。
靜態庫:鏈接時完整地拷貝至可執行文件中,被多次使用就有多份冗余拷貝。【.a和.framework】
動態庫:鏈接時不復制,程序運行時系統動態加載到內存,供程序調用,系統只加載一次,多個程序共用,節省內存?!?dylib和.framework】
注:系統的.framework是動態庫,我們自己建立的.framework是靜態庫。
網上的相關資料有很多,主要參考進行學習,為方便記憶,主要以截圖的方式進行記錄:
在stackoverflow上找到關于Link binary 和 Embeb Framework 的區別,感覺原文更直接,就直接復制過過來了;
??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.
制作通用動態庫,這一塊目前還沒有完全理解,先記錄一下流程,
新建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文件
這樣生成的動態庫就能同時支持模擬器和真機了
xCode6下制作通用靜態庫
上面我們也提到了,這樣生成的動態庫恐怕很難在xCode5上使用,那我們為什么非要用動態庫呢,一般情況下不是用靜態庫就好了嗎? So Easy!只需要修改一個參數即可生成靜態庫了
使用靜態庫的話,就可以把Framework從‘Embedded Binaries’中刪除了. 親測在xCode5下可用。把新生成的庫導入到測試工程,試試在模擬器和真機上運行,一切OK.
不巧,如果你用的真機是iPhone5 C, 那悲劇又要發成了,生成的Framework竟然不支持armv7s,不知是xCode6的bug,還是因為蘋果認為使用armv7s的設備太少,可以不支持了.xCode6新建工程,默認的Architectures竟然不包含armv7s
想要生成的庫支持armv7s,把armv7s添加到Architectures中,重新生成Framework即可
判斷一個Framework支持哪些架構
我們該怎么驗證生成的Framework支持哪些平臺呢,總不能一個個測試吧?當然不用.下面的命令是加上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靜態庫還.framework靜態庫,我們需要的都是二進制文件+.h+其它資源文件的形式,不同的是,.a本身就是二進制文件,需要我們自己配上.h和其它文件才能使用,而.framework本身已經包含了.h和其它文件,可以直接使用。
2圖片資源的處理:兩種靜態庫,一般都是把圖片文件單獨的放在一個.bundle文件中,一般.bundle的名字和.a或.framework的名字相同。.bundle文件很好弄,新建一個文件夾,把它改名為.bundle就可以了,右鍵,顯示包內容可以向其中添加圖片資源。
3 category是我們實際開發項目中經常用到的,把category打成靜態庫是沒有問題的,但是在用這個靜態庫的工程中,調用category中的方法時會有找不到該方法的運行時錯誤(selector not recognized),解決辦法是:在使用靜態庫的工程中配置other
linker flags的值為-ObjC 。(注:一些第三方庫里對系統庫的類加了category;這時,就需要使用編譯參數:-ObjC,這樣第三方庫中對系統類作的擴展方法才能在工程中使用)
4如果一個靜態庫很復雜,需要暴露的.h比較多的話,就可以在靜態庫的內部創建一個.h文件(一般這個.h文件的名字和靜態庫的名字相同),然后把所有需要暴露出來的.h文件都集中放在這個.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出來就可以了。
接下來對github的本地倉庫與遠程倉庫進行總結,代碼總的有個歸宿。。。。利人利己
更多精彩內容請關注“IT實戰聯盟”哦~~~
