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