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