runtime如何實現?
OC這個語言盡可能的將一些決定從編譯器推遲到運行時,他會盡可能的動態處理事情,這意味著這個語言不僅需要一個編譯器,還需要一個運行時系統,使得這個語言得以運行。
RunTime簡稱運行時。就是系統在運行的時候的一些機制,其中最主要的是消息機制。對于C語言,函數的調用在編譯的時候會決定調用哪個函數( C語言的函數調用請看這里 )。編譯完成之后直接順序執行,無任何二義性。OC的函數調用成為消息發送。屬于動態調用過程。在編譯的時候并不能決定真正調用哪個函數(事實證明,在編 譯階段,OC可以調用任何函數,即使這個函數并未實現,只要申明過就不會報錯。而C語言在編譯階段就會報錯)。只有在真正運行的時候才會根據函數的名稱找 到對應的函數來調用。
Runloop
一般來講,一個線程一次只能執行一個任務,執行完成后線程就會退出。runloop就是一種機制,讓線程能隨時處理事件但并不退出,
一個run loop就是一個事件處理循環,用來不停的監聽和處理輸入事件并將其分配到對應的目標上進行處理。相對于普通循環,NSRunLoop是一種更加高明的消息處理模式,他對消息處理過程進行了更好的抽象和封裝,把消息打包成input source或者是timer source。
其次,也是很重要的一點,使用runloop可以使你的線程在有工作的時候工作,沒有工作的時候休眠,這可以大大節省系統資源。
OC類怎么執行?
- 當程序啟動時,就會加載項目中所有的類,而且加載后會調用每個類的
+load
方法,只會調用一次; - 當第一次使用某個類時,就會調用當前類的
+initialize
方法; - 先加載父類,再加載子類(先調用父類的
+load
方法,再調用子類的+load
方法,最后調用分類的+load
方法),先初始化父類,再初始化子類(先調用父類的+initialize
方法,再調用子類的+initialize
方法)。 - 注意:在初始化的時候,如果在分類中重寫了
+initialize
方法,則會覆蓋掉父類的。 - 重寫
+initialize
方法可以監聽類的使用情況。
首先從硬盤load程序代碼到內存。
其次操作系統找到程序入口開始執行。
再次在程序執行過程中進行內存的管理。主要需要四部分內存空間:堆區用來存放創建的對象;棧區用來存放局部變量;數據區用來存放靜態變量和字符串常量;代碼區用來存放程序代碼。