第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

Runtime系列(Method Swizzling)

標(biāo)簽:
iOS
前言

记得《大话西游2》中有这么个桥段,紫霞仙子和猪八戒中招移魂幻影大法后灵魂互换,当时看的也是泪流满面。。而Method Swizzling就是传说中的移魂幻影大法!身体还是那个身体,但是灵魂已被互换,同样的身体言行举止都变成被换对象。

正文

代码很好理解,如果还在想为什么不会陷入死循环,是时候重温这部经典影片了。

如果交换后再交换呢?

显然,偶数次交换后方法的实现不变

说一下使用Method Swizzling的几个注意点:

最好在+ (void)load中实现交换

通常我们使用这个技巧时,希望在整个项目都可以实现交换效果,毫无疑问+ (void)load是最佳选择。只要当前类参与编译,在程序启动后就会调用,并且仅调用一次,这样就防止了IMP出现偶数次交换的情况。在继承关系下,先调用父类的+ (void)load再调子类,继承关系下的分类调用关系刚好相反。

既然+ (void)load只会调用一次,为什么还要加dispatch_once?

dispatch_once

如果你刚好知道+ (void)initialize的存在,可能会觉得在+ (void)initialize中实现交换也未尝不可,毕竟当外界调用当前类的方法时,会提前调用initialize,好像也是只调一次。

首先要纠正一个错误:initialize并非只会调用一次,如调用子类的某个方法,并且只实现父类的initialize,这个时候父类的initalize会调用2次,所以加上dispatch_once可以确保交换代码只执行一次。

除此之外,swizzle写在initialize中当遇到并发情况时,程序仍然有可能诡异的crash掉,所以要加dispatch_once。
如果swizzle写在+ (void)load是不是就不用加dispatch_once了,因为不涉及并发,而且+ (void)load不是只会调用一次么?load是系统

在调,但同样支持手动调用,为防止特殊情况发生,加dispatch_once总没错。

swizzle多为交换系统自带方法(下面两条普遍适用)

  • 在交换时要调用系统方法的原始实现,即调用super

  • 为避免出现命名与系统某自带方法相同,方法名最好带上前缀
    写在最后

更好的写法是,在load的dispatch_once内部末尾加上这段代码

让我们先来搞清楚这段代码究竟是在做什么:

第一句是添加IMPswizzlingMethod到SELoriginSel中(只是添加,不会覆盖orginSel的原有实现),当且仅当originSel为当前类的父类方法时才能添加成功。如果添加成功将SELswizzlingSel的实现用原有的IMPoriginMethod覆盖,关系如下:


这是一种变相的swizzle。

點(diǎn)擊查看更多內(nèi)容
5人點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
移動(dòng)開發(fā)工程師
手記
粉絲
7
獲贊與收藏
67

關(guān)注作者,訂閱最新文章

閱讀免費(fèi)教程

感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消