一、Runtime 舉例--高大上的叫法:Method Swizzling ?實(shí)際就是?IMP和SEL進(jìn)行交換,通俗來說SEL相當(dāng)于目錄、IMP相當(dāng)于頁碼,我們查找書的目錄的時(shí)候,如果交換了頁碼,就會(huì)出現(xiàn)A目錄 會(huì)執(zhí)行B頁碼的方法。
第一步:簡(jiǎn)單寫個(gè)小例子。
我們很容易看出來 URL是不存在的,但是OC中NSURL這個(gè)類 不會(huì)檢測(cè)nil,這樣給我們開發(fā)會(huì)帶來很多麻煩。我就想能不能讓NSURL去檢測(cè)呢?
第二步:解決的辦法就是寫NSURL的Category 來代替這個(gè)方法。
然后把URLWithString換成XL_URLWithStr 就可以了。
第三步:目前來說,還是不夠完美,每一個(gè)地方都要換成xl這個(gè),我想還是用系統(tǒng)的URLWithString ?但是我要執(zhí)行XL_URLWithStr里面的方法。(神奇了吧 ??)
現(xiàn)在就交換了方法的實(shí)現(xiàn),但上面代碼還有問題。就是會(huì)造成死循環(huán),執(zhí)行URLWithString就會(huì)調(diào)用自己,不停的調(diào)用自己。
解決方法就是:
這樣就完美解決了問題。
二、runtime實(shí)例--動(dòng)態(tài)添加方法
首先調(diào)用一個(gè)類 不存的方法。
然后
就這么BUG ?,然后就成功動(dòng)態(tài)添加了一個(gè)方法eat。
然后我又試了一下傳值:
如果不寫那2個(gè)隱式參數(shù),打印的str 是看不懂的一串,我也是經(jīng)過了各種百度 才發(fā)現(xiàn)這個(gè)。
總結(jié)一下:在調(diào)用oc方法時(shí)候,會(huì)給IMP傳入2個(gè)參數(shù),方法的調(diào)用者 id self、方法的編號(hào)SEL _cmd.