日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

iOS总结-Runtime篇之黑魔法Method Swizzling的滥用会有危险吗

發(fā)布時(shí)間:2024/3/13 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS总结-Runtime篇之黑魔法Method Swizzling的滥用会有危险吗 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。