蘋果官方文檔是最正確的學習姿式html
The Objective-C language defers as many decisions as it can from compile time and link time to runtime. Whenever possible, it does things dynamically. This means that the language requires not just a compiler, but also a runtime system to execute the compiled code. The runtime system acts as a kind of operating system for the Objective-C language; it’s what makes the language work. Objective-C語言儘量多地推遲從編譯時和連接時到運行時的決策。只要有可能,它就會動態地執行操做。這意味着該語言不只須要編譯器,還須要運行時系統來執行編譯後的代碼。運行時系統做爲Objective-C語言的一種操做系統;這就是語言的工做原理。bash
那麼什麼是運行時?什麼叫編譯時?app
編譯時顧名思義就是正在編譯的時候.那啥叫編譯呢?就是編譯器幫你把源代碼翻譯成機器能識別的代碼.
(固然只是通常意義上這麼說,實際上可能只是翻譯成某個中間狀態的語言) 那編譯時就是簡單的做一些翻譯工做,好比檢查老兄你有沒有粗心寫錯啥關鍵字了啊.有啥詞法分析,語法分析之類的過程.就像個老師檢查學生的做文中有沒有錯別字和病句同樣.若是發現啥錯誤編譯器就告訴你.若是你用微軟的VS的話,點下build.那就開始編譯,若是下面有errors或者warning信息,那都是編譯器檢查出來的.所謂這時的錯誤就叫編譯時錯誤,這個過程當中作的啥類型檢查也就叫編譯時類型檢查,或靜態類型檢查(所謂靜態嘛就是沒把真把代碼放內存中運行起來,而只是把代碼看成文原本掃描下).因此有時一些人說編譯時還分配內存啥的確定是錯誤的說法.ide
所謂運行時就是代碼跑起來了.被裝載到內存中去了.(你的代碼保存在磁盤上沒裝入內存以前是個死傢伙.只有跑到內存中才變成活的).而運行時類型檢查就與前面講的編譯時類型檢查(或者靜態類型檢查)不同.不是簡單的掃描代碼.而是在內存中作些操做,作些判斷.函數
我如今就來測試 : 下面是一個LGPerson對象學習
LGPerson *p = [LGPerson new];
clang -rewrite-objc main.m -o mian.cpp
複製代碼
由於咱們都知道OC底層是C,咱們進一步能夠編譯C++代碼(重寫)測試
經過C++編譯 個人天啊. 9851
行代碼嚇我一哆嗦,不過不要緊.做爲一名優秀iOS底層開發人員,誰沒見過一萬行代碼
似的!何況不少我都不須要考慮,裏面有不少結構體,都是一些引入,還有不少函數,也不是咱們關心的,咱們把文件拖到最下面ui
int main(int argc, const char * argv[]) {
/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;
LGPerson *p = ((LGPerson *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("LGPerson"), sel_registerName("new"));
LGStudent*s = ((LGStudent *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("LGStudent"), sel_registerName("new"));
((void (*)(id, SEL))(void *)objc_msgSend)((id)p, sel_registerName("run"));
((void (*)(id, SEL))(void *)objc_msgSend)((id)s, sel_registerName("walk"));
}
return 0;
}
複製代碼
這就有點熟悉了,這不是咱們main
函數的編譯? 而後先無論下面的方法調用的編譯,咱們全局查找LGPerson
spa
#ifndef _REWRITER_typedef_LGPerson
#define _REWRITER_typedef_LGPerson
typedef struct objc_object LGPerson;
typedef struct {} _objc_exc_LGPerson;
#endif
struct LGPerson_IMPL {
struct NSObject_IMPL NSObject_IVARS;
};
複製代碼
很明顯的一句話typedef struct objc_object LGPerson;
那麼咱們的LGPerson
就是objc_object類型的結構體
~~~那麼咱們所說的對象預計都是objc_object類型的結構體
!咱們帶着好奇心繼續查看objc_object
操作系統
struct objc_object {
Class _Nonnull isa __attribute__((deprecated));
};
複製代碼
很是熟悉的身形isa
這個時候我就想到了另一個東西NSObject
typedef struct objc_object NSObject;
struct NSObject_IMPL {
Class isa;
};
複製代碼
咱們的NSObject
的isa
是objc_object
結構體重的屬性在咱們實現NSObject
的時候只是對isa
的重寫~~~isa
也是咱們後面後面學習很是重要的路線.好比咱們編譯block
也能看到isa
,表明這個匿名函數也是對象,也重複符合萬物皆對象
的說法!!!