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噢!