iOS总结-Runtime篇之黑魔法Method Swizzling的滥用会有危险吗
參考https://www.jianshu.com/p/19c5736c5d9a,
http://blog.sina.com.cn/s/blog_a343f32b0101en4o.html
runtime的Method Swizzling確實(shí)很方便,動(dòng)態(tài)交換方法,所謂就是黑科技.其實(shí)就是C語(yǔ)言的Hook原理所謂的鉤子.
但是如果濫用,尤其是多個(gè)開(kāi)發(fā)人員開(kāi)發(fā),就有可能造成坑.其中RSSwizzle,ASPect就是能解決這個(gè)風(fēng)險(xiǎn),只是代碼風(fēng)格寫(xiě)的確實(shí)和其他的不一樣,可以參考上面的這個(gè)鏈接,我實(shí)驗(yàn)過(guò),確實(shí)是會(huì)沒(méi)有把父類(lèi)Person的p_sayHello給Hook到,這是因?yàn)镺C里面父類(lèi)+load會(huì)比子類(lèi)先執(zhí)行,但是如果父類(lèi)的類(lèi)別的(Person+swizzle),子類(lèi)的類(lèi)別(Student+swizzle)的加載,取決于編譯的順序,也就是有可能子類(lèi)的類(lèi)別先執(zhí)行,父類(lèi)的類(lèi)別從而沒(méi)有執(zhí)行,這里的原因可能是子類(lèi)的方法優(yōu)先級(jí)還是高于父類(lèi)的方法,這其實(shí)也是類(lèi)別的原理吧.
看完上面的鏈接,我們要思考幾個(gè)問(wèn)題:
? ? ? 1.如果我們交換的是系統(tǒng)的方法,那么系統(tǒng)的IMP會(huì)不會(huì)有處理,這個(gè)我暫時(shí)還沒(méi)有研究,但是我們可能想到的是,有可能會(huì)把父類(lèi)的方法給Hook掉,會(huì)讓我們莫名其妙的找不到原因.
? ? ? 2.我們?cè)谟玫組ethod swizzling的時(shí)候,首先+load方法,dispatch_once確保首次,寫(xiě)法前面有.
有關(guān) Method Swizzling的陷阱
Method Swizzling ?is not atomic
使用method swizzling實(shí)現(xiàn)的方法在并發(fā)使用時(shí)基本都是安全的。也就是把修改方法實(shí)現(xiàn)的操作放在+load里,并在應(yīng)用程序一開(kāi)始就調(diào)用執(zhí)行,你將不會(huì)碰到并發(fā)問(wèn)題,如果你在+(void)initialize初始化里面進(jìn)行swizzlw,就有問(wèn)題.
change behavior of un-owned code
大多數(shù)情況下,父類(lèi)方法期望被調(diào)用,如果你在swizzling實(shí)現(xiàn)中也這樣做了,這會(huì)避免大部分問(wèn)題。還是調(diào)用原始實(shí)現(xiàn)吧。
possible naming conflicts 命名沖突
多個(gè)有繼承關(guān)系的類(lèi)的對(duì)象swizzle時(shí),先從父對(duì)象開(kāi)始。這樣才能保證子類(lèi)方法拿到父類(lèi)中的被swizzle的實(shí)現(xiàn)。在+(void)load中swizzle不會(huì)出錯(cuò),就是因?yàn)閘oad類(lèi)方法會(huì)默認(rèn)從父類(lèi)開(kāi)始調(diào)用.
總結(jié)
以上是生活随笔為你收集整理的iOS总结-Runtime篇之黑魔法Method Swizzling的滥用会有危险吗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Windows 32位下cocos2d-
- 下一篇: 牛客网之黑暗的字符串