基礎總結(jié)(runtime/runloop)

1.runtime介紹(http://www.reibang.com/p/ea2d0a6fa8d6)

OC是一門動態(tài)語言背伴,所以它總想辦法把一些決定工作從編譯推遲到運行時。也就是說只有編譯器是不夠的臣疑,它還需要一個運行時系統(tǒng)來執(zhí)行編譯后的代碼。這就是Runtime系統(tǒng)存在的意義,它是整個OC的一個基石亮靴。

Runtime基本是用C和匯編語言寫的,可見蘋果為動態(tài)系統(tǒng)的高效做出的努力落君。

Runtime庫主要做下面幾件事:

封裝:在這個庫中穿香,對象可以用C語言中的結(jié)構(gòu)體表示,而方法可以用C函數(shù)來實現(xiàn)绎速,另外再加上了一些額外的特性皮获。這些結(jié)構(gòu)體和函數(shù)被runtime函數(shù)封裝后,我們就可以在程序運行時創(chuàng)建纹冤,檢查洒宝,修改類、對象和它們的方法了萌京。

runtime核心是消息傳遞;

1. 消息發(fā)送流程

?? 確定調(diào)用方法的類是否加載完畢

?? 調(diào)用objc_msgSend方法,給調(diào)用對象發(fā)送消息

?? 對象在方法緩存列表(cache)中查詢是否有對應方法,有直接調(diào)用

?? 沒有的話在對象方法列表中查找->父類->>>nsobject 沒找到進入消息動態(tài)解析

2. 消息動態(tài)解析

?? 接收消息對象未找到對應的實現(xiàn)方法,調(diào)用solverStanceMethod或者solverClassMethod 看是否進行方法動態(tài)創(chuàng)建方法 創(chuàng)建了就直接使用再次進入消息發(fā)送流程沒有就進入消息轉(zhuǎn)發(fā)

接收消息對象未找到對應的實現(xiàn)方法,調(diào)用solverStanceMethod后者solverClassMethod看是否進行方法動態(tài)創(chuàng)建方法 創(chuàng)建了就直接使用再次進入

3. 消息轉(zhuǎn)發(fā)

?? 快速轉(zhuǎn)發(fā):forwardingTargertSelector方法進行方法執(zhí)行對象重定向這個快速轉(zhuǎn)發(fā)方法,沒有處理就進入完整消息轉(zhuǎn)發(fā) 調(diào)用methodSignatureForSelector獲得函數(shù)的參數(shù)和返回值類型 創(chuàng)建nsinvocation(求助對象)? 發(fā)送forwardingInvocation消息給目標對象 沒獲取到函數(shù)信息? 就會發(fā)出 donsNotrecognizeselector消息 崩潰

應用

1.????動態(tài)方法交換 method? swizzling

? ? ? ? 通過 class_getClassMethod()/Class_getInStanceMethod()方法,獲取方法實現(xiàn)地址,通過method_exhangeImplementtations()方法交換兩個方法

?? ? ? 方法的置換在類的 +load方法中調(diào)用

?? ? ? 攔截并替換系統(tǒng)方法

2.????分類添加新屬性?

借助runtime的關(guān)聯(lián)對象特性,幫助我們在運行階段任意屬性關(guān)聯(lián)到一個對象上,實現(xiàn)屬性一樣的效果;

? ? ? 例子:? nsdate分類的year/month/day/hour等

3.????獲取類的詳細信息

包裹屬性列表/成員變量/方法/協(xié)議等

?4. 動態(tài)添加方法和修改屬性變量的值

?5. 歸檔和解檔? 字典和模型的轉(zhuǎn)換(KVC)

6.????KVO實現(xiàn)原理

利用Runtime生成一個中間對象雁歌,讓原對象的isa指針指向它,然后重寫 setter方法枫夺,插入willChangeValueForKey和didChangeValueForKey方 法将宪。 當屬 性變化時會調(diào)用,會調(diào)用這兩個方法通知到外界屬性變化橡庞。


runloop

它是一個處理事件的循環(huán)(線程進入這個循環(huán)较坛,運行事件處理程序來響應傳入的事件),RunLoop的目的是當有事件需要處理時扒最,線程是活躍的丑勤、忙碌的,當沒有事件后吧趣,線程進入休眠

Runloop Mode實際上是 Source法竞,Timer 和 Observer 的集合,不同的 Mode 把不同組的Source,Timer和Observer隔絕開來.Runloop 在某個時刻只能跑在一個 Mode 下强挫,處理這一個 Mode 當中的 Source岔霸,Timer 和 Observer

基本作用

1、保持程序的持續(xù)運行

2俯渤、處理App中的各種事件(比如觸摸事件呆细、定時器事件等)

3、節(jié)省CPU資源八匠,提高程序性能:該做事時做事絮爷,該休息時休息

應用范疇

1、定時器(Timer)梨树、PerformSelector

2坑夯、GCD Async Main Queue

3、事件響應抡四、手勢識別柜蜈、界面刷新

4仗谆、網(wǎng)絡請求

5、AutoreleasePool

runloop與線程之間的關(guān)系

1跨释、每條線程都有唯一的一個與之對應的RunLoop對象

2胸私、RunLoop保存在一個全局的Dictionary里,線程作為key鳖谈,RunLoop作為value

3、線程剛創(chuàng)建時并沒有RunLoop對象阔涉,RunLoop會在第一次獲取它時創(chuàng)建([NSRunLoop currentRunLoop])

4缆娃、RunLoop會在線程結(jié)束時銷毀

5、主線程的RunLoop已經(jīng)自動獲裙迮拧(創(chuàng)建)贯要,子線程默認沒有開啟RunLoop

runloop內(nèi)部實現(xiàn)邏輯

第一步:首先通知Observers進入Loop 然后處理一些 定時器、事件椭住、block

第二步:事件處理完成之后通知Observers進入休眠狀態(tài)開始休眠 等待消息喚醒

第三步:通知Observers結(jié)束休眠處理一些 定時器崇渗、事件、block

autoreleasePool 在何時被釋放

App啟動后京郑,蘋果在主線程 RunLoop 里注冊了兩個 Observer宅广,其回調(diào)都是 _wrapRunLoopWithAutoreleasePoolHandler()

第一個 Observer 監(jiān)視的事件是 Entry(即將進入Loop),其回調(diào)內(nèi)會調(diào)用 _objc_autoreleasePoolPush() 創(chuàng)建自動釋放池,優(yōu)先級最高些举,保證創(chuàng)建釋放池發(fā)生在其他所有回調(diào)之前

第二個 Observer 監(jiān)視了兩個事件: BeforeWaiting(準備進入休眠) 時調(diào)用_objc_autoreleasePoolPop() 和 _objc_autoreleasePoolPush() 釋放舊的池并創(chuàng)建新池;Exit(即將退出Loop) 時調(diào)用 _objc_autoreleasePoolPop() 來釋放自動釋放池,優(yōu)先級最低,保證其釋放池子發(fā)生在其他所有回調(diào)之后

在主線程執(zhí)行的代碼跟狱,通常是寫在諸如事件回調(diào)、Timer回調(diào)內(nèi)的户魏。這些回調(diào)會被 RunLoop 創(chuàng)建好的 AutoreleasePool 環(huán)繞著驶臊,所以不會出現(xiàn)內(nèi)存泄漏,開發(fā)者也不必顯示創(chuàng)建 Pool 了

PerformSelector 的實現(xiàn)原理

當調(diào)用NSObject的performSelecter:afterDelay:后叼丑,實際上其內(nèi)部會創(chuàng)建一個Timer并添加到當前線程的RunLoop中,所以如果當前線程沒有RunLoop关翎,則這個方法會失效

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鸠信,隨后出現(xiàn)的幾起案子纵寝,更是在濱河造成了極大的恐慌,老刑警劉巖症副,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件店雅,死亡現(xiàn)場離奇詭異,居然都是意外死亡贞铣,警方通過查閱死者的電腦和手機闹啦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辕坝,“玉大人窍奋,你說我怎么就攤上這事。” “怎么了琳袄?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵江场,是天一觀的道長。 經(jīng)常有香客問我窖逗,道長址否,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任碎紊,我火速辦了婚禮佑附,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仗考。我一直安慰自己音同,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布秃嗜。 她就那樣靜靜地躺著权均,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锅锨。 梳的紋絲不亂的頭發(fā)上叽赊,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音橡类,去河邊找鬼蛇尚。 笑死,一個胖子當著我的面吹牛顾画,可吹牛的內(nèi)容都是我干的取劫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼研侣,長吁一口氣:“原來是場噩夢啊……” “哼谱邪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起庶诡,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤惦银,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后末誓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扯俱,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年喇澡,在試婚紗的時候發(fā)現(xiàn)自己被綠了迅栅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晴玖,死狀恐怖读存,靈堂內(nèi)的尸體忽然破棺而出为流,到底是詐尸還是另有隱情,我是刑警寧澤让簿,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布敬察,位于F島的核電站,受9級特大地震影響尔当,放射性物質(zhì)發(fā)生泄漏莲祸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一椭迎、第九天 我趴在偏房一處隱蔽的房頂上張望虫给。 院中可真熱鬧,春花似錦侠碧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓷式,卻和暖如春替饿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贸典。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工视卢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人廊驼。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓据过,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妒挎。 傳聞我的和親對象是個殘疾皇子绳锅,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353

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