Object-C | 淺談封裝與靜態(tài)庫(kù)封裝

定義

封裝指的是將對(duì)象的狀態(tài)信息隱藏在對(duì)象內(nèi)部瓶颠,不允許外部程序直接訪問(wèn)對(duì)象內(nèi)部信息猩系,而是通過(guò)該類所提供的方法來(lái)實(shí)現(xiàn)對(duì)內(nèi)部信息的操作和訪問(wèn)昼伴。而SDK封裝通常是指動(dòng)態(tài)庫(kù):.dylib/..framework.和靜態(tài)庫(kù).framework食磕、.a

具體來(lái)說(shuō)冗恨,封裝就是把該隱藏的隱藏起來(lái)答憔,把該暴露的暴露出來(lái)。這兩個(gè)方面通過(guò)OC提供的訪問(wèn)控制符來(lái)實(shí)現(xiàn)掀抹。

訪問(wèn)控制符順序

各控制符的作用:
默認(rèn):同一個(gè)包中的類可以訪問(wèn)虐拓。
1:@private(當(dāng)前類訪問(wèn)權(quán)限):只能在當(dāng)前類內(nèi)部被訪問(wèn)。用于徹底隱藏成員變量傲武。在類的實(shí)現(xiàn)部分定義的成員變量相當(dāng)于默認(rèn)用這種訪問(wèn)權(quán)限蓉驹。 (私有的:只有該類可以訪問(wèn)城榛,權(quán)限最小)
2:@package(與映像訪問(wèn)權(quán)限相同):可以在當(dāng)前類以及當(dāng)前類實(shí)現(xiàn)的同一個(gè)映像的任意地方訪問(wèn)态兴。這個(gè)訪問(wèn)控制符用于部分隱藏成員變量狠持。
3:@protected(子類訪問(wèn)權(quán)限):可以在當(dāng)前類、當(dāng)前類的子類的任意部分訪問(wèn)瞻润。用于暴露部分成員變量喘垂。在類的接口部分定義的成員變量默認(rèn)使用這種訪問(wèn)權(quán)限。(受保護(hù)的:該類及其子類的成員可以訪問(wèn)绍撞,同一個(gè)包中的類也可以訪問(wèn))
4:@public(公共訪問(wèn)權(quán)限):可以在任意部分訪問(wèn)正勒,不管是否處于同一個(gè)映像中,不管是否具有父子繼承關(guān)系傻铣。(該類或非該類均可訪問(wèn)章贞,權(quán)限最大)

靜態(tài)庫(kù) VS 動(dòng)態(tài)庫(kù)

靜態(tài)庫(kù)即是靜態(tài)鏈接庫(kù),在編譯時(shí)將代碼拷貝進(jìn)目標(biāo)程序中非洲,會(huì)導(dǎo)致目標(biāo)程序的體積增加鸭限。被多次使用就會(huì)在內(nèi)存中存在多份冗余拷貝靜態(tài)庫(kù)的代碼就相當(dāng)于是目標(biāo)程序的一部分
動(dòng)態(tài)庫(kù)在編譯時(shí)并不會(huì)被拷貝到目標(biāo)程序中怪蔑,目標(biāo)程序中只會(huì)存儲(chǔ)指向動(dòng)態(tài)庫(kù)的引用里覆。等到App啟動(dòng)時(shí)丧荐,動(dòng)態(tài)庫(kù)才會(huì)被真正加載缆瓣。進(jìn)行rebase指針調(diào)整bind符號(hào)綁定等工作,導(dǎo)致App的啟動(dòng)時(shí)間增長(zhǎng)虹统。由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存弓坞,供App調(diào)用,系統(tǒng)只加載一次车荔,多個(gè)程序共用渡冻,節(jié)省內(nèi)存

蘋果的動(dòng)態(tài)庫(kù)發(fā)展史

iOS 8之前,iOS平臺(tái)不支持自定義動(dòng)態(tài)庫(kù)忧便,開(kāi)發(fā)者可以使用的動(dòng)態(tài)庫(kù)只能是蘋果自家的 UIKit.framework 族吻、 Foundation.framework 等。這種限制的原因是出于安全考慮珠增,因?yàn)?code>iOS應(yīng)用都是運(yùn)行在沙盒中超歌,不同的程序之間不能共享代碼,動(dòng)態(tài)下載代碼是蘋果明令禁止的蒂教,既然沒(méi)辦法發(fā)揮動(dòng)態(tài)庫(kù)的優(yōu)勢(shì)巍举,動(dòng)態(tài)庫(kù)也就沒(méi)有存在的必要了。
iOS 8之前凝垛,也有一些第三方提供的.framework文件存在懊悯,但是它們本質(zhì)上都是靜態(tài)庫(kù)蜓谋,只不過(guò)通過(guò)一些方法進(jìn)行了包裝,相比較.a文件使用更方便一些炭分。
iOS 8/Xcode 6推出后桃焕,iOS平臺(tái)添加了動(dòng)態(tài)庫(kù)的支持,支持開(kāi)發(fā)者有條件地創(chuàng)建和使用動(dòng)態(tài)庫(kù)捧毛,這種動(dòng)態(tài)庫(kù)叫做 Cocoa Touch Framework 覆旭,但是這種動(dòng)態(tài)framework系統(tǒng)的framewor還是有很大區(qū)別的。系統(tǒng)的framework在編譯時(shí)不需要拷貝進(jìn)目標(biāo)程序中岖妄,而 Cocoa Touch Framework 在打包和提交App時(shí)會(huì)被放到app bundle中型将,運(yùn)行在沙盒里,不同的app就算使用了相同的framework也是會(huì)有多份的框架被分別簽名荐虐、打包和加載七兜,因此蘋果又把這種framework稱為在Embedded Framework
Cocoa Touch Framework的推出主要是為了解決兩個(gè)問(wèn)題:從iOS 8開(kāi)始的擴(kuò)展開(kāi)發(fā)Swift在早期不支持編譯為靜態(tài)庫(kù)

靜態(tài)庫(kù).framework和.a的區(qū)別

.a是純二進(jìn)制文件 .framework中除了二進(jìn)制文件還有資源文件
.a文件不能直接使用福扬,需要引入.h文件配合 .framework文件包含了.h文件和其他文件腕铸,可以直接使用
.a文件是靜態(tài)庫(kù),.framework 既可以是靜態(tài)庫(kù)也可以是動(dòng)態(tài)庫(kù)

關(guān)于如何制作.a文件.framework文件的教程網(wǎng)上特別多铛碑,這里我就不做具體描述狠裹。這里主要總結(jié)一下幾個(gè)關(guān)鍵點(diǎn)。

架構(gòu)

蘋果的架構(gòu)分為兩大類:
模擬器架構(gòu) : i386 32位架構(gòu)汽烦、x86_64 64位架構(gòu)
真機(jī)架構(gòu) : armv7 32位架構(gòu)涛菠、armv7s 特殊架構(gòu)arm64 64位架構(gòu)

合并架構(gòu)

使用模擬器編譯出來(lái)的包是模擬器架構(gòu)撇吞,使用真機(jī)編譯出來(lái)的包是真機(jī)架構(gòu)俗冻。可以使用lipo -info查看當(dāng)前包的架構(gòu)類型牍颈。真機(jī)和模擬器架構(gòu)合成的好處是調(diào)試會(huì)非常方便迄薄,缺點(diǎn)是體積會(huì)變大,一般而言煮岁,SDK都需要合成架構(gòu)方便使用者使用讥蔽。合并架構(gòu)的命令:lipo -create simulator.a device.a -output name.a 合并.framework文件的架構(gòu)命令也是使用lipo -create區(qū)別點(diǎn)是合成的是.framework文件內(nèi)部的可執(zhí)行文件

腳本打包

手動(dòng)打包雖然能滿足我們的需求,但是利用腳本打包會(huì)帶來(lái)幾點(diǎn)優(yōu)勢(shì):

1:提高效率画机,原本繁瑣的打包流程冶伞,只需要執(zhí)行一下腳本就能完成
2:統(tǒng)一規(guī)范,繁瑣的操作流程色罚,依賴個(gè)人去完成碰缔,難免會(huì)出現(xiàn)差錯(cuò),利用腳本可以確保準(zhǔn)確性
3:易于使用戳护,利用腳本打包金抡,即使是新人也可以非常容易的上手瀑焦,降低溝通成本

既然腳本打包有這么多優(yōu)點(diǎn),接下來(lái)就總結(jié)一下實(shí)現(xiàn)腳本打包的過(guò)程:

腳本打包思路

利用xcodebuild分別打包模擬器架構(gòu)和真機(jī)架構(gòu)
利用lipo -create合并模擬器和真機(jī)架構(gòu)
如果是framework的合并梗肝,需要將合并了的二進(jìn)制可執(zhí)行文件復(fù)制到framework中
復(fù)制文件到指定目錄下榛瓮,并打開(kāi)文件夾

腳本代碼如下

# Sets the target folders and the finalframework product.

# 如果工程名稱和Framework的Target名稱不一樣的話,要自定義FMKNAME

# 例如: FMK_NAME = "MyFramework"   你生成的就是MyFramework.Framework

FMK_NAME="MyTestFramework"

# Install dir will be the final output tothe framework.

# The following line create it in the rootfolder of the current project.

INSTALL_DIR=${SRCROOT}/Products/${FMK_NAME}.framework

# Working dir will be deleted after theframework 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 binaryfiles (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}"

利用Aggregate提供快捷方法

在當(dāng)前項(xiàng)目下新建Aggregate Target

新建Aggregate Target

添加Run Script

添加Run Script

在Run Script Phases輸入腳本內(nèi)容

在Run Script Phases輸入腳本內(nèi)容

編譯Aggregate Target 完成腳本打包

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巫击,一起剝皮案震驚了整個(gè)濱河市禀晓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坝锰,老刑警劉巖粹懒,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異顷级,居然都是意外死亡凫乖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門弓颈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)帽芽,“玉大人,你說(shuō)我怎么就攤上這事翔冀〉冀郑” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵纤子,是天一觀的道長(zhǎng)搬瑰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)计福,這世上最難降的妖魔是什么跌捆? 我笑而不...
    開(kāi)封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任徽职,我火速辦了婚禮象颖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘姆钉。我一直安慰自己说订,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布潮瓶。 她就那樣靜靜地躺著陶冷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毯辅。 梳的紋絲不亂的頭發(fā)上埂伦,一...
    開(kāi)封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音思恐,去河邊找鬼沾谜。 笑死膊毁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的基跑。 我是一名探鬼主播婚温,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼媳否!你這毒婦竟也來(lái)了栅螟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤篱竭,失蹤者是張志新(化名)和其女友劉穎力图,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體掺逼,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡搪哪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了坪圾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晓折。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兽泄,靈堂內(nèi)的尸體忽然破棺而出漓概,到底是詐尸還是另有隱情,我是刑警寧澤病梢,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布胃珍,位于F島的核電站,受9級(jí)特大地震影響蜓陌,放射性物質(zhì)發(fā)生泄漏觅彰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一钮热、第九天 我趴在偏房一處隱蔽的房頂上張望填抬。 院中可真熱鬧,春花似錦隧期、人聲如沸飒责。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宏蛉。三九已至,卻和暖如春性置,著一層夾襖步出監(jiān)牢的瞬間拾并,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嗅义,地道東北人个榕。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像芥喇,于是被迫代替她去往敵國(guó)和親西采。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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