iOS runtime之方法交換與簡(jiǎn)單封裝:runtime method_exchangeImplementations

最近聽了蠻多 runtime 平時(shí)完全用不到的這種言論芍阎,所以慢慢的寫一點(diǎn) runtime 在項(xiàng)目中的應(yīng)用場(chǎng)景躁绸。其中之一就是吮铭,當(dāng)更新的資源包的文件無法正確讀取的時(shí)候矛渴,替換成一張占位圖椎扬。

能看的實(shí)現(xiàn)方法有如下幾種:

  • 寫一個(gè)類別方法,在類別中進(jìn)行邏輯處理具温。
  • 用原方法蚕涤,但是進(jìn)行動(dòng)態(tài)方法交換。

第一個(gè)缺點(diǎn)其實(shí)很明顯铣猩,當(dāng)團(tuán)隊(duì)成員不斷增加之后揖铜,沒有辦法確保每一個(gè)人都能按照你的規(guī)范來使用工具類別中的指定方法,除非特別想每天抽不止一點(diǎn)時(shí)間 Code Review达皿。
那么第二個(gè)方案帶來的則是一勞永逸天吓,但是在使用的時(shí)候一定要評(píng)估影響。比如:組件化的時(shí)候經(jīng)常會(huì)用到 bundle 來儲(chǔ)存圖片峦椰,并且使用 cocoapods 來進(jìn)行組件管理龄寞,那么獲取圖片的邏輯就要考慮到你取 -imageNamed: 方法獲得的,可能是原圖片汤功,也可能是占位圖物邑。那么就需要做相關(guān)的邏輯處理。

在例子中,我們只是簡(jiǎn)單展示了一下方法交換的使用方式拂封。

// 這是例子茬射,用的是類別實(shí)現(xiàn)。類別的話冒签,我們丟項(xiàng)目里就可以使用了在抛,并不需要再進(jìn)行引入頭文件。

#import "UIImage+PlaceHolderImage.h"
#import <objc/runtime.h>

@implementation UIImage (PlaceHolderImage)

+ (void)load
{
     // 獲取 UIImage 方法 -imageNamed: 的 Method
    Method imageNameMethod = class_getClassMethod(self, @selector(imageNamed:));

     // 獲取 UIImage+PlaceHolderImage 方法 -replaced_imageNamed: 的 Method
    Method replaced_imageNamedMethod = class_getClassMethod(self, @selector(replaced_imageNamed:));
    
     // 將兩個(gè)方法進(jìn)行交換萧恕,現(xiàn)在如果調(diào)用 -imageNamed: 則調(diào)用的是下方 +replaced_imageNamed: 的實(shí)現(xiàn) 
    method_exchangeImplementations(imageNameMethod, replaced_imageNamedMethod);
}

+ (UIImage *)replaced_imageNamed:(NSString *)imageName
{
      // 這里是遞歸調(diào)用嗎刚梭?不是。因?yàn)楝F(xiàn)在調(diào)用 +replaced_imageNamed: 實(shí)現(xiàn)則是蘋果框架內(nèi)的  -imageNamed: 的實(shí)現(xiàn)票唆。
    UIImage *image = [UIImage replaced_imageNamed:imageName];
    if (!image)
    {
        image = [UIImage replaced_imageNamed:@"placeholder_image"];
    }
    return image;
}

@end

一個(gè)簡(jiǎn)單的封裝朴读,如下:

#import <objc/runtime.h>

- (void)pd_exchangeSelector:(SEL)originSel toSelector:(SEL)replazSel
{
    [[self class] _pd_exchangeSelector:originSel toSelector:replazSel];
}

+ (void)pd_exchangeSelector:(SEL)originSel toSelector:(SEL)replazSel
{
    [self _pd_exchangeSelector:originSel toSelector:replazSel];
}

+ (void)_pd_exchangeSelector:(SEL)originSel toSelector:(SEL)replazSel
{
    Method originMethod = class_getClassMethod(self, originSel);
    Method replazMethod = class_getClassMethod(self, replazSel);
    method_exchangeImplementations(originMethod, replazMethod);
}

實(shí)際項(xiàng)目中,建議使用成熟的 Aspects 庫進(jìn)行 AOP 編程走趋,功能強(qiáng)大衅金,穩(wěn)定高效。
本想解析一下 Aspects 庫的簿煌,一看網(wǎng)上很多很多氮唯,就偷個(gè)懶粘一個(gè)鏈接了。

傳送門:
Aspects | github
Aspects 解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姨伟,一起剝皮案震驚了整個(gè)濱河市惩琉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夺荒,老刑警劉巖瞒渠,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異技扼,居然都是意外死亡伍玖,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門剿吻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來私沮,“玉大人,你說我怎么就攤上這事和橙∽醒啵” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵魔招,是天一觀的道長(zhǎng)晰搀。 經(jīng)常有香客問我,道長(zhǎng)办斑,這世上最難降的妖魔是什么外恕? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任杆逗,我火速辦了婚禮,結(jié)果婚禮上鳞疲,老公的妹妹穿的比我還像新娘罪郊。我一直安慰自己,他們只是感情好尚洽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布悔橄。 她就那樣靜靜地躺著,像睡著了一般腺毫。 火紅的嫁衣襯著肌膚如雪癣疟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天潮酒,我揣著相機(jī)與錄音睛挚,去河邊找鬼。 笑死急黎,一個(gè)胖子當(dāng)著我的面吹牛扎狱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播勃教,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼淤击,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了荣回?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤戈咳,失蹤者是張志新(化名)和其女友劉穎心软,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體著蛙,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡删铃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踏堡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猎唁。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖顷蟆,靈堂內(nèi)的尸體忽然破棺而出诫隅,到底是詐尸還是另有隱情,我是刑警寧澤帐偎,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布逐纬,位于F島的核電站,受9級(jí)特大地震影響削樊,放射性物質(zhì)發(fā)生泄漏豁生。R本人自食惡果不足惜兔毒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甸箱。 院中可真熱鬧育叁,春花似錦、人聲如沸芍殖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽围小。三九已至昵骤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肯适,已是汗流浹背变秦。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留框舔,地道東北人蹦玫。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刘绣,于是被迫代替她去往敵國(guó)和親樱溉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容