引言
相信接觸過iOS的同學對或多或少都有耳聞。 創建一個對象:
[[ alloc] init];
復制代碼
點擊進入其定義:
可以發現其進入了文件 .h 中
右擊該文件,選擇: show in 可以看到 暴露給我們的文件:
雖然暴露給我們的不多,但其實已經能提供給我們很多功能,剛剛我們的對象創建就是一個典型的功能。 眾所周知, 對象是-C語言中幾乎所有對象的根類。換言之,任何一個對象的創建都是通過實現的,僅此一點,的重要性可見一斑,現在的iOS面試也越來越通過對的面試來區分iOS開發人員的水平高低。
筆者研究源碼有一段時間了,隨著研究的深入,對的實現也越來越感興趣,因此想寫一套系列教程來和大家討論的底層實現。
下載源碼
蘋果開源了的實現,在網站 //objc… 中可以找到各個版本的源碼。 但提供的是一個個文件,不方便打包下載,網站 //ob… 中提供了壓縮包的下載。
編譯
下載下來的源碼是運行不了的,缺少一些依賴文件,找起來也比較繁瑣。這里筆者fork了一份,供大家參考(該項目編譯過程大家可以參考這篇文章: objc - 編譯源碼objc4-680 ):
如圖,打開工程后選擇工程debug-objc,點擊run即可。由于debug-objc依賴于objc(即的源代碼編譯的庫),因此我們在main函數中所有-C的代碼會調用我們編譯的,從而方便我們調試。
目錄分析
源碼目錄結構如下:
文件夾是我們引入的項目需要的依賴文件
文件夾是對外暴露的,點開后我們不難發現ios源代碼有多大,和文章開頭給出的文件列表一模一樣:
從字面意思了解,是私有的一些方法
項目中會用到的頭文件
一些 孤立 的文件,大部分可刪,只有 .h 的文件會被其他文件使用到。
無實質用處,可全刪
目錄,是的實現文件集合,后面的文章主要是研究這個目錄。
小試牛刀
在我們的main.m中,輸入以下代碼:
#
int main(int argc, const char * argv[]) {
@ {
*obj = [[ alloc] init];
}
0;
}
復制代碼
打斷點后,我們會發現 *obj = [[ alloc] init];方法最終會調用到中的.mm中。也就是說ios源代碼有多大,對象的創建都是在.mm中完成的。 具體實現流程,會在后面的文章中逐步揭曉。