iOS~runtime理解上篇 - (開發面試必備)

什麼是Runtime?

Runtime 又叫運行時,是一套底層的 C 語言 API,其爲 iOS 內部的核心之一,咱們平時編寫的 OC 代碼,底層都是基於它來實現的。web

多數狀況咱們只須要編寫 OC 代碼便可,Runtime 系統自動在幕後搞定一切,因此不少朋友對runtime不是很重視,等面試的時候常常被面試官卡住.我也是新手,吃了這個虧,因此對runtime進行了學習,以通俗易懂的方式分享給你們面試

面試題:  runtime是什麼?或者是同類的學習

答: 其實runtime就是運行時機制,能夠經過命令行clang -rewrite-objc 對應的目標文件,就能將對應的OC的代碼轉成對應的運行時的代碼url

 

或者說,我如今有一個項目,已經開發了兩年,以前都是用WKWebView去加載URL,可是組長如今想判斷URL是否爲空,給我提示是否加載成功.那麼項目中那麼多的web頁,一個一個去改,太麻煩.就能夠用runtime,下文...spa

Runtime 的做用

能夠經過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實現系統內部方法的修改. 新手分享,大神不喜勿噴.

相關文章
相關標籤/搜索