使用XCode7打包動(dòng)態(tài)庫/靜態(tài)庫

使用XCode7打包動(dòng)態(tài)庫/靜態(tài)庫

@(?開發(fā))[iOS,Xcode]
文章同步在個(gè)人主頁~

[TOC]

iOS中的靜態(tài)庫和動(dòng)態(tài)庫

概念

靜態(tài)庫(Static Library)
.a 為后綴,它是你的源碼的實(shí)現(xiàn).m文件編譯而成的二進(jìn)制文件集合,需要配合上暴漏的.h文件使用,它在引用鏈接時(shí)拷貝至可執(zhí)行文件中,程序運(yùn)行時(shí)加載到內(nèi)存,期間被多次使用就有多份冗余拷貝和加載;
動(dòng)態(tài)庫(Dynamic Framework)
.dylib.framework為后綴,也是一堆.h和.m的集合,.m同樣被編譯成了二進(jìn)制,不同的是,它還可以包含nib文件,資源文件等,系統(tǒng)的framework在鏈接時(shí)先檢查內(nèi)存中是否已經(jīng)加載,如果有,就不再進(jìn)行復(fù)制,這樣多個(gè)應(yīng)用程序可以共享內(nèi)存中得同一份庫文件,節(jié)省了內(nèi)存.

注意:
1.在iOS8之前,或者xcode6之前,你可能也見過開發(fā)者自己打包的framework,具體方法可以看這里這里,但是,這些辛苦打包出來的framework依然是靜態(tài)庫的形式(程序運(yùn)行時(shí)被加載到內(nèi)存,即便此時(shí)內(nèi)存中其他應(yīng)用也用了此framework并且已經(jīng)加載進(jìn)內(nèi)存了);
2.系統(tǒng)的.framework是動(dòng)態(tài)庫,也就是說我們代碼中最常見的#import <Foundation/Foundation.h>導(dǎo)入的foundation框架,當(dāng)我們運(yùn)行程序的時(shí)候,其實(shí)內(nèi)存中已經(jīng)預(yù)加載了這些系統(tǒng)框架,此時(shí)我們打開應(yīng)用時(shí)不會(huì)再次加載這些,這就減少了內(nèi)存的占用.雖然在xcode6之后蘋果爸爸允許我們自己生成framework了,但是,它依然只是存在于當(dāng)前應(yīng)用的沙盒中而非提交到系統(tǒng)中,這就意味著每次依然會(huì)加載到內(nèi)存中...

創(chuàng)建自己的framework

相比較于靜態(tài)庫,動(dòng)態(tài)庫有著自己的優(yōu)勢(shì),除去上文中說道的資源包含和內(nèi)存加載問題,在使用的時(shí)候相比較于.a的靜態(tài)庫也更方便,因?yàn)樗臼“宋覀兯枰乃匈Y源(自包含);所以我建議,我們更應(yīng)該生成動(dòng)態(tài)framework而非.a靜態(tài)庫;

為已有類擴(kuò)展分類使我們經(jīng)常的做法,現(xiàn)在我們將實(shí)例如何將分類打包成framework使用;
1.新建工程->選擇iOS下Framework&Library->CocoaTouch Framework;

2.將我們的要打包的文件拖進(jìn)工程,這里不要建立文件夾(圖1);

圖1

可以看到這里有一個(gè)額外的文件XCommonExtension.h,它在我們生成工程之后自動(dòng)為我們生成,這里你可以將打包的public文件都通過import的方式導(dǎo)入頭文件到這里,在其他開發(fā)者使用framework的時(shí)候只用引用這個(gè).h頭文件即可;

3.在build phases中,我們可以看到有一個(gè)Headers的選項(xiàng),我們上一步添加的文件都會(huì)在這里顯示,不過默認(rèn)的是在project下,這里我們需要把需要暴露的拖動(dòng)到public下,完成后如下(圖2)

圖2

4.Build-Run,到此,你的""模擬器版""的framework已經(jīng)生成了,它只能在模擬器中鏈接引用,到真機(jī)運(yùn)行的時(shí)候就有問題了,接下來,我們?cè)谏烧鏅C(jī)版的framework,同時(shí)把他們合并成一個(gè)通用的framework;

5.選中target->在工具欄點(diǎn)擊Editor->Add Target->在彈出的選擇框中選擇Other->Aggregate->Next;現(xiàn)在你的工程總有了兩個(gè)target(圖3)

圖3

6.選中剛加入的這個(gè)target,點(diǎn)擊右上的 + 號(hào) -> New Run Script Phase,我們將在這里嵌入我們的腳本script;

# 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}/"
cp -R "${SIMULATOR_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}"

將以上代碼段復(fù)制,粘貼在Run Script下Shell下方的黑框中;

7.選中新加入的這個(gè)Scheme,編譯運(yùn)行(圖4);

圖4

8.編譯運(yùn)行之后你的finder就會(huì)彈出生成的framework,找到并拷貝出來,大功告成,下面我們就可以使用它了;

使用我們的framework

9.在新建的工程中加入我們生成的framework,在Embedded Framework中加入我們的framework,在要使用的文件中引入頭文件;

import <XCommonExtension/XCommonExtension.h>

注意:
1.這里我們打包的為分類,在使用的時(shí)候,需要在other linker flag中添加-ObjC或者-force_load參數(shù);
2.帶有圖片資源的需要把圖片打包成Bundle文件焚鹊,和framework一起拷貝到相應(yīng)的項(xiàng)目中.

到此為止,我們制作出來了可供使用的framework,如果想要更多人使用到你的framework,你可以利用cocoaPods,編寫自己的PodSpec文件,或者利用Carthage,發(fā)布你的framework;

-over-

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俱饿,更是在濱河造成了極大的恐慌,老刑警劉巖低零,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件副硅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡爸业,警方通過查閱死者的電腦和手機(jī)其骄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扯旷,“玉大人拯爽,你說我怎么就攤上這事【觯” “怎么了毯炮?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)惰瓜。 經(jīng)常有香客問我否副,道長(zhǎng),這世上最難降的妖魔是什么崎坊? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任备禀,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曲尸。我一直安慰自己赋续,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布另患。 她就那樣靜靜地躺著纽乱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昆箕。 梳的紋絲不亂的頭發(fā)上鸦列,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音鹏倘,去河邊找鬼薯嗤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纤泵,可吹牛的內(nèi)容都是我干的骆姐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼捏题,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼玻褪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起公荧,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤带射,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后稚矿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庸诱,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年晤揣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桥爽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昧识,死狀恐怖钠四,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情跪楞,我是刑警寧澤缀去,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站甸祭,受9級(jí)特大地震影響缕碎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜池户,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一咏雌、第九天 我趴在偏房一處隱蔽的房頂上張望凡怎。 院中可真熱鬧,春花似錦赊抖、人聲如沸统倒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽房匆。三九已至,卻和暖如春报亩,著一層夾襖步出監(jiān)牢的瞬間浴鸿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工捆昏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赚楚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓骗卜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親左胞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子寇仓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 靜態(tài)庫與動(dòng)態(tài)庫的區(qū)別 首先來看什么是庫遍烦,庫(Library)說白了就是一段編譯好的二進(jìn)制代碼,加上頭文件就可以供別...
    吃瓜群眾呀閱讀 11,882評(píng)論 3 42
  • 僅以方便自己查閱記錄前言1.靜態(tài)庫和動(dòng)態(tài)庫有什么異同躺枕?靜態(tài)庫:鏈接時(shí)完整地拷貝至可執(zhí)行文件中服猪,被多次使用就有多份冗...
    190CM閱讀 4,178評(píng)論 0 4
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,512評(píng)論 25 707
  • 介紹 動(dòng)態(tài)庫形式:.dylib和.framework 靜態(tài)庫形式:.a和.framework 動(dòng)態(tài)庫和靜態(tài)庫的區(qū)別...
    齊滇大圣閱讀 46,131評(píng)論 18 252
  • 記得去年,探梅時(shí)節(jié)拐云。老來舊事無人說罢猪。為誰醉倒為誰醒?到今猶恨輕離別叉瘩。
    立來閱讀 156評(píng)論 0 0