對於Objective-C運行時,個人一些理解

運行時究竟是什麼,我也不是特別的明白,我說不清完整的定義,因此只能說說本身對於OC運行時的簡單理解了。咱們在點擊Xcode的Run按鈕的時候,其實內部發生了不少的事情,也就是編譯的過程,簡單地說就是:編譯->連接->生成目標文件,這是大多數語言在編譯的時候經歷的過程,目的是把人類能看懂的代碼(Objective-C、C、Java。。。)轉換成計算機可以識別的010110...二進制代碼。
ide

咱們一直學習OC,不通過對比真的不是那麼容易瞭解動態語言(例如OC)和靜態語言(例如C++)的區別,由於項目中用到C++,因此簡單地看了一點,有一句話讓我豁然開朗,就是對於C++靜態語言特性的解釋:C++是一門靜態類型語言,在編譯時候會做類型檢查。也就是說C++對於語法的要求極爲嚴格,你代碼中的邏輯錯誤在編譯的時候就給你指出來;而OC相對來講就不那麼嚴格了,好比一個UIButton對象btn關聯的事件,學習

[backBtn addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];ui

,而btnClicked方法你沒有實現,Xcode在編譯的時候是不會報錯的,而在運行的時候由於沒有找到btn對應的點擊方法btnClicked,這時候程序會crash,這種unrecognized selector錯誤,相信iOS碼農深有體會;還好比實現一個協議,協議中有@required修飾的方法-(void)requiredMethod;,也就是必需要實現,這時候若是沒有實現這個方法,編譯的時候是不會報錯的,只會有一個黃色的警告,但在運行時候調用到這個方法的時候,由於找不到這個方法,程序會crash,因此有時候爲了防止這個錯誤,要寫上以下判斷語句spa

if ([self.delegate respondsToSelector:@selector(requiredMethod)]) {3d

    [self.delegate requiredMethod];
code

}orm

來避免程序crash。對象

也就是說OC不單單把類型的判斷推遲到了運行時,聲明的方法、協議中的方法即便你沒有實現也不會編譯錯誤,由於OC把對於方法是否實現的判斷也推遲到了運行時。事件

這是我對於運行時的一些簡單瞭解,有什麼錯誤和不足的地方還請大神指教。get

相關文章
相關標籤/搜索