runtime簡單使用之方法的交換

一, 使用runtime實(shí)現(xiàn)方法的交換

一, 前言

  • 在開發(fā)過程中,我們常常會(huì)遇到一種問題: 即當(dāng)我們使用系統(tǒng)自帶的方法時(shí),發(fā)現(xiàn)系統(tǒng)方法的功能不能滿足我們的需求,這時(shí)候需要我們給系統(tǒng)的方法添加額外的功能.

  • 下面以一個(gè)例子來實(shí)現(xiàn)給系統(tǒng)自帶的方法添加額外的功能.

  • 項(xiàng)目背景 : 公司有個(gè)開發(fā)了很久的項(xiàng)目,之前使用添加圖片的方法用的是:imageName:方法, 現(xiàn)在的項(xiàng)目需求是給系統(tǒng)自帶的imageName:添加一個(gè)功能:如果下載的圖片不存在,那么就提示我們當(dāng)前下載的圖片為空.

  • 思路 : 給系統(tǒng)自帶的方法添加功能的幾種方法

    • 1, 自定義類, 重寫系統(tǒng)自帶的imageName:方法,這種方法雖然可以實(shí)現(xiàn),但是它的弊端就是必須要使用自己的類,依賴性強(qiáng).
    • 2, 個(gè)UIImage添加一個(gè)分類, 改變系統(tǒng)類的實(shí)現(xiàn),給系統(tǒng)的類添加方法的時(shí)候調(diào)用(強(qiáng)烈不推薦)
    • 3, 使用runtime的交互方法,給系統(tǒng)的方法添加功能. 具體實(shí)現(xiàn) : 添加一個(gè)分類 --> 在分類中提供一個(gè)需要添加的功能的方法 --> 將這個(gè)方法的實(shí)現(xiàn)和系統(tǒng)自帶的方法的實(shí)現(xiàn)交互.

二, 步驟

  • 1, 新建一個(gè)繼承自UIImage的分類,定義一個(gè)方法實(shí)現(xiàn)給系統(tǒng)的自帶的方法添加功能.
#import <UIKit/UIKit.h>

@interface UIImage (WGImage)

// 聲明方法
// 如果跟系統(tǒng)方法差不多功能,可以采取添加前綴,與系統(tǒng)方法區(qū)分
+ (UIImage *)wg_imageWithName:(NSString *)imageName;

@end

  • 2, 實(shí)現(xiàn)方法的交互

 定義完畢新方法后,需要弄清楚什么時(shí)候?qū)崿F(xiàn)與系統(tǒng)的方法交互?
 答 : 既然是給系統(tǒng)的方法添加額外的功能,換句話說,我們以后在開發(fā)中都是使用自己定義的方法,取代系統(tǒng)的方法,所以,當(dāng)程序一啟動(dòng),就要求能使用自己定義的功能方法.說道這里:我們必須要弄明白一下兩個(gè)方法 :
 +(void)initialize(當(dāng)類第一次被調(diào)用的時(shí)候就會(huì)調(diào)用該方法,整個(gè)程序運(yùn)行中只會(huì)調(diào)用一次)
 + (void)load(當(dāng)程序啟動(dòng)的時(shí)候就會(huì)調(diào)用該方法,換句話說,只要程序一啟動(dòng)就會(huì)調(diào)用load方法,整個(gè)程序運(yùn)行中只會(huì)調(diào)用一次)


+ (void)load {
/*
     self:UIImage
     誰的事情,誰開頭 1.發(fā)送消息(對象:objc) 2.注冊方法(方法編號(hào):sel) 3.交互方法(方法:method) 4.獲取方法(類:class)
     Method:方法名

     獲取方法,方法保存到類
     Class:獲取哪個(gè)類方法
     SEL:獲取哪個(gè)方法
     imageName
*/
    // 獲取imageName:方法的地址
    Method imageNameMethod = class_getClassMethod(self, @selector(imageNamed:));

    // 獲取wg_imageWithName:方法的地址
    Method wg_imageWithNameMethod = class_getClassMethod(self, @selector(wg_imageWithName:));

    // 交換方法地址琼开,相當(dāng)于交換實(shí)現(xiàn)方式
    method_exchangeImplementations(imageNameMethod, wg_imageWithNameMethod);

}

  • 3, 加載圖片, 判斷當(dāng)前圖片是否為空
// 加載圖片, 判斷是否為空
+ (UIImage *)wg_imageWithName:(NSString *)imageName
{
    // 這里調(diào)用imageWithName规求,相當(dāng)于調(diào)用imageName
    UIImage *image = [UIImage wg_imageWithName:imageName];
    if (!image) {
        NSLog(@"Alex : 圖片不存在");
    }
    return image;
}

  • 4, 使用交互后的方法
#import "ViewController.h"
#import "WGStudent.h"
#import "UIImage+WGImage.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

  //  wg_imageWithName ---> imageNamed(底層的操作 : 1, 下載圖片. 2, 判斷圖片是否存在 )
    [UIImage imageNamed:@"WilliamAlex.png"];
}

@end
  • 5, 打印結(jié)果
2016-03-08 17:29:50.372 fdsfsdf[1545:96854] Alex : 圖片不存在

知識(shí)拓展

  • 不能在分類中重寫系統(tǒng)方法imageNamed欢嘿,因?yàn)闀?huì)把系統(tǒng)的功能給覆蓋掉际度,而且分類中不能調(diào)用super.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泰鸡,一起剝皮案震驚了整個(gè)濱河市鹿寻,隨后出現(xiàn)的幾起案子限匣,更是在濱河造成了極大的恐慌徙融,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件西壮,死亡現(xiàn)場離奇詭異遗增,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)款青,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門做修,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抡草,你說我怎么就攤上這事饰及。” “怎么了康震?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵燎含,是天一觀的道長。 經(jīng)常有香客問我腿短,道長屏箍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任橘忱,我火速辦了婚禮赴魁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钝诚。我一直安慰自己颖御,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布凝颇。 她就那樣靜靜地躺著潘拱,像睡著了一般疹鳄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芦岂,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天瘪弓,我揣著相機(jī)與錄音,去河邊找鬼盔腔。 笑死杠茬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的弛随。 我是一名探鬼主播瓢喉,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼舀透!你這毒婦竟也來了栓票?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤愕够,失蹤者是張志新(化名)和其女友劉穎走贪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惑芭,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坠狡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了遂跟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逃沿。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幻锁,靈堂內(nèi)的尸體忽然破棺而出凯亮,到底是詐尸還是另有隱情,我是刑警寧澤哄尔,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布假消,位于F島的核電站,受9級(jí)特大地震影響岭接,放射性物質(zhì)發(fā)生泄漏富拗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一鸣戴、第九天 我趴在偏房一處隱蔽的房頂上張望啃沪。 院中可真熱鬧,春花似錦葵擎、人聲如沸谅阿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽签餐。三九已至,卻和暖如春盯串,著一層夾襖步出監(jiān)牢的瞬間氯檐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工体捏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留冠摄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓几缭,卻偏偏與公主長得像河泳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子年栓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,114評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫拆挥、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 多想就這樣的一醉方休 只可恨無人陪酒 有的只是殊途不同歸的路人 走散在街角的十字口 多的也只是腰纏萬貫的客人 假若...
    Baron丶小樂閱讀 209評論 1 2
  • 1.1 欲某抓、知纸兔、行閉環(huán)心理學(xué)模型 欲、知否副、行閉環(huán)心理學(xué)汉矿,這里首先要解釋幾個(gè)概念,欲是欲望备禀、動(dòng)機(jī)洲拇、念頭,知是知道(知...
    愛智慧閱讀 597評論 0 1