關(guān)于runtime的文章已經(jīng)有很多很多了,有些也寫的很詳細,但紙上得來終覺淺,我還是決定自己動手學(xué)一學(xué),并且記錄下這個過程。
這一系列準備寫的內(nèi)容,更多的是寫給我自己看。
第一篇文章,決定寫寫OC的運行時,也就是runtime。
這東西正常幾乎接觸不到,最常用的應(yīng)該算是在category中添加property時,使用的AssociatedObject。蘋果自己在runtime官方文檔中也說了:
Typically, though, there should be little reason for you to need to know and understand this material to write a Cocoa application.
翻譯:會不會這玩意兒無關(guān)緊要。
但畢竟runtime也算是整個OC的基礎(chǔ),理解runtime對理解這門語言有很大的幫助,我也想以此為切入點,提高一下閱讀源碼的能力。
runtime的內(nèi)容很多,一篇肯定寫不完,本文先就目前我對runtime的理解做一點簡單的介紹,后面隨著源碼的閱讀會分成多篇來詳細分析。
runtime概述
OC是一門動態(tài)語言,OC盡可能多的將工作留到了運行時,而不是在編譯期和鏈接期,這賦予了OC很多強大的功能,這也是runtime所要做的工作。
runtime可以看做是一個庫,主要由c和匯編來實現(xiàn),我們在OC里面所寫的類,方法,屬性等等在runtime層面都會轉(zhuǎn)化成c的結(jié)構(gòu)體。
官方文檔中說通常我們會通過三個方面與runtime打交道:
- OC源代碼
- NSObject提供的相關(guān)方法
- runtime庫提供的各種api
第1個方面就不說了,第2和第3部分是這個系列的重點。我會分析正常寫OC代碼接觸較多的,比如類(class),方法(method),屬性(property),協(xié)議(protocol),分類(category),自動釋放池(autoreleasepool),引用計數(shù)(retain,release等),初始化(load,alloc,init,new等)等這些內(nèi)容的源代碼。
希望通過對runtime的研究能夠加深對OC的理解,戒掉淺嘗輒止的壞毛病,走上造輪子的道路。
調(diào)試環(huán)境準備
想要學(xué)習(xí)runtime,必須有一個可以運行的環(huán)境才行,蘋果官方的源代碼沒法編譯,這里有可以運行的runtime source code。在最新的Mac OS 10.12.2 + Xcode 8.2.1環(huán)境下有效。