Runtime 又叫運行時,是一套底層的 C 語言 API,其爲 iOS 內部的核心之一,咱們平時編寫的 OC 代碼,底層都是基於它來實現的。web
多數狀況咱們只須要編寫 OC 代碼便可,Runtime 系統自動在幕後搞定一切,因此不少朋友對runtime不是很重視,等面試的時候常常被面試官卡住.我也是新手,吃了這個虧,因此對runtime進行了學習,以通俗易懂的方式分享給你們面試
面試題: runtime是什麼?或者是同類的學習
答: 其實runtime就是運行時機制,能夠經過命令行clang -rewrite-objc 對應的目標文件,就能將對應的OC的代碼轉成對應的運行時的代碼url
或者說,我如今有一個項目,已經開發了兩年,以前都是用WKWebView去加載URL,可是組長如今想判斷URL是否爲空,給我提示是否加載成功.那麼項目中那麼多的web頁,一個一個去改,太麻煩.就能夠用runtime,下文...spa
能夠經過Runtime修改系統方法,比方說咱們平時在項目中用到WKWebView(UIWebView)去加載一些url,若是在URL中含有中文,OC語言是不可以識別出該URL的.因此咱們輸出的URL爲null,此時界面就加載不出來,那麼咱們如何去避免這種問題? 命令行
第一種方式,使用Category(類的擴展)首先咱們建立一個繼承與NSURL的擴展orm
而後咱們在這個擴展的.h中寫一個類方法blog
而後在.m中去實現繼承
最後回到本身的控制器去導入這個擴展到頭文件,將原本系統的URLWithString 改爲本身擴展的類方法,這樣咱們就能輕易的定位到爲何本身的URL沒有加載出來了開發
那麼重點來了,咱們如何使用Runtime去實現修改系統提供給咱們的方法呢?(不用自定義方法)
首先你們要知道,執行URLWithString方法的時候,系統內部會首先調用+(void)load方法,那咱們就在這個方法裏邊使用Runtime進行修改,先導入頭文件#import <objc/runtime.h>而後在load方法中將系統的URLWithString方法和咱們以前自定義的BX_UrlWithString方法進行交換.也就是說,當咱們調用URLWithString方法加載url的時候,讓系統內部自動調用咱們自定義的BX_UrlWithString方法中來.下圖都有註釋,此時咱們在咱們控制器中用URLWithString去加載URL就會實現了在他的內部多一個咱們本身加的功能(判斷URL是否爲nil)
Runtime還有動態添加方法(也能夠說是方法的懶加載)
面試官問: 有沒有使用過performSelector----->其實這裏面試官想問的是你有沒有動態的添加過方法
這裏就應該這樣答: 使用過--->何時使用----動態添加方法的時候使用------>爲何動態添加方法---又回到到上面說的何時動態添加方法.
到這裏咱們就實現了使用Runtime實現系統內部方法的修改. 新手分享,大神不喜勿噴.