【iOS分享之路-快速上手Runtime】二、方法交換

duwenquan-方形LOGO.png

引述

在通常開發(fā)過程中,我們經常會用到系統(tǒng)類,而它提供的方法又不能完全滿足我們開發(fā)的需要,那么在此時,我們需要為系統(tǒng)自帶的方法擴展一些功能,而且還要保證原有的功能可正常使用.假設咱們現在有這么一個需求,我們在調用系統(tǒng)的[UIImage imageNamed:@"runtime"];的時候,我們并不能判斷有沒有加載成功,所以我們想在加載圖片的時候并判斷是否加載成功。

解決方案

  • 1.我想多數讀者首先想到的就是運用分類,添加一個自定義方法來實現這個功能。
    步驟1.創(chuàng)建一個UIimage的分為,在.h文件中聲明一個方法,并在.m文件中實現這個方法
//.h文件中聲明
+(UIImage *)dwq_imageNamed:(NSString *)imageName;
//.m文件中實現
+(UIImage *)dwq_imageNamed:(NSString *)imageName{

   //首先加載圖片
    UIImage *image=[UIImage imageNamed:imageName];
    
   //然后實現功能【判斷是否為空】
  
    if (image==nil) {
        NSLog(@"圖片為空");
    }
    return image;
}


步驟2.在需要使用的地方,引入分類頭文件,然后調用類方法

#import "UIImage+DWQcategory.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImage *image=[UIImage dwq_imageNamed:@"runtime"];
}

這樣,我們就可以實現我們的功能需求,但是,我們最初的想法是想還是通過調用系統(tǒng)的方法來實現加載圖片并判斷是否加載成功,而且這里使用的話還要引入分類頭文件。那么,接下里我們用第二種方法實現,利用Runtime交換方法來實現

  • 2.Runtime交換方法,我們想通過調用系統(tǒng)的imageNamed方法的時候本質是調用dwq_imageNamed就可以了。
    ?步驟1.在分類加載的時候+(void)load;交換方法的實現
    ?步驟2.方法交換之前首先獲取方法,因為交換方法的兩個參數就是方法
//獲取類方法:class_getClassMethod
   //獲取實力方法:class_getInstanceMethod
    //IMP:方法的實現
    //1.首先獲取方法
    /*參數說明*/
    // Class :哪個類的方法
    // SEL :獲取方法編號
    Method imageNameMethod=   class_getInstanceMethod([UIImage class], @selector(imageNamed:));
    Method dwq_imageNameMethod=   class_getClassMethod([UIImage class], @selector(dwq_imageNamed:));

步驟3.交換方法

 //方法的交換
    method_exchangeImplementations(imageNameMethod, dwq_imageNameMethod);

步驟4.如果此時你認為完事了,調用系統(tǒng)的imageNamed方法,會造成死循環(huán)。因為我們在自定義的方法中加載圖片調用的就是系統(tǒng)的imageNamed的方法,此時應該修改代碼如下:

防止死循環(huán).png

Runtime交換方法效果

交換方法.png

Runtime交換方法Demo

Runtime交換方法Demo
廣大書友記得給個贊,在GitHub上給個Star噢!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 對于從事 iOS 開發(fā)人員來說,所有的人都會答出【runtime 是運行時】什么情況下用runtime?大部分人能...
    夢夜繁星閱讀 3,734評論 7 64
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,523評論 25 708
  • 2017年11月13日 星期一 多云 經過一番努力,我的生物實踐活動班終于成立了!...
    廿一妹閱讀 235評論 0 1
  • 一、定位 實現定位需要使用Core Location框架(Core Location框架屬于Core Servic...
    Zentopia閱讀 1,991評論 0 4
  • 喜歡這種被歲月沉淀過后的憂郁和沉靜,也愛看沿途路過的風景!
    佐淇閱讀 226評論 0 1