iOS開發(fā)中靜態(tài)庫和動態(tài)庫區(qū)別
靜態(tài)庫和動態(tài)庫是相對編譯期和運行期的:靜態(tài)庫在程序編譯時會被鏈接到目標(biāo)代碼中,程序運行時將不再需要改靜態(tài)庫;而動態(tài)庫在程序編譯時并不會被鏈接到目標(biāo)代碼中,只是在程序運行時才被載入,因為在程序運行期間還需要動態(tài)庫的存在。
靜態(tài)庫 好處:
- 模塊化,分工合作,提高了代碼的復(fù)用及核心技術(shù)的保密程度
- 避免少量改動經(jīng)常導(dǎo)致大量的重復(fù)編譯連接
- 也可以重用,注意不是共享使用
動態(tài)庫 好處:
- 使用動態(tài)庫,可以將最終可執(zhí)行文件體積縮小,將整個應(yīng)用程序分模塊,團隊合作,進行分工,影響比較小
- 使用動態(tài)庫,多個應(yīng)用程序共享內(nèi)存中得同一份庫文件,節(jié)省資源
- 使用動態(tài)庫,可以不重新編譯連接可執(zhí)行程序的前提下,更新動態(tài)庫文件達(dá)到更新應(yīng)用程序的目的。
- 應(yīng)用插件化
- 軟件版本實時模塊升級
1.生成靜態(tài)庫
1.1 新建靜態(tài)庫工程

屏幕快照 2019-04-24 下午4.37.26.png
1.2 編寫功能

屏幕快照 2019-04-24 下午4.37.32.png
1.3 然后command+b 編譯,生成.a 文件

屏幕快照 2019-04-24 下午4.40.57.png
1.4 然后利用 lipo -info 查看靜態(tài)庫所支持的cpu架構(gòu)

屏幕快照 2019-04-24 下午4.41.52.png
如果需要真機的 可以變一下真機的靜態(tài)庫
lipo -create ../x.a ../x.a -output test.a
1.5 把合成的靜態(tài)庫導(dǎo)入到項目中
分別把.a文件和.h文件 導(dǎo)入功能,在所需要引用的地方,導(dǎo)入頭文件,即可使用
2.生成動態(tài)庫
2.1 生成動態(tài)庫項目

屏幕快照 2019-04-24 下午5.10.38.png
2.2 把想要暴露的頭文件 拖動到public 文件夾中

屏幕快照 2019-04-24 下午5.11.32.png
2.3 把framework 導(dǎo)入到工程中
由于動態(tài)庫不會被鏈接到目標(biāo)代碼中,所以必須手動cpoy到項目中

屏幕快照 2019-04-24 下午5.15.50.png
2.4 然后運行

2.5 合并真機和模擬器的庫
在Xcode中添加執(zhí)行腳本

2068442-6174f5acae9a9c41.jpeg
Project --> TARGETS --> Build Phases -> + --> New Run Script Phases 添加執(zhí)行腳本,如下:
# Type a script or drag a script file from your workspace to insert its path.
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 "${DEVICE_DIR}" ] || [ ! -d "${SIMULATOR_DIR}" ]
then
exit 0
fi
# 如果合并包已經(jīng)存在,則替換
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
mkdir -p "${INSTALL_DIR}"
cp -R "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# 使用lipo命令將其合并成一個通用framework
# 最后將生成的通用framework放置在工程根目錄下新建的Products目錄下
lipo -create "${DEVICE_DIR}/${PROJECT_NAME}" "${SIMULATOR_DIR}/${PROJECT_NAME}" -output "${INSTALL_DIR}/${PROJECT_NAME}"
#合并完成后打開目錄
open "${SRCROOT}/Products"
fi
注意: 只有在真機,模擬器各編譯一次后,才會在工程/Products目錄下生產(chǎn)合并包,如不希望自動打開目錄,注釋掉最后一句#open "${SRCROOT}/Products"即可
GitHub靜態(tài)庫和動態(tài)庫demo