我們在做開發的時候比如系統自帶的方法功能不夠,給系統自帶的方法擴展一些功能,并且保持原有的功能。
目前需求 :給imageNamed 方法提供功能,每次加載圖片就判斷下圖片是否加載成功。
兩種辦法
方式一:繼承UIImage.重寫方法
方式二:使用runtime,交換方法
分類里不能調用super 分類木有父類
/*
+(UIImage*)imageNamed:(NSString *)name
{
}
*/
這個時候我們要再返回參數加kindof
+(__kindof UIImage*)SJ_imageNamed:(NSString *)imageName
{
//1.加載圖片
UIImage *image=[UIImage SJ_imageNamed:imageName];
//2.判斷功能
if (image==nil)
{
NSLog(@"加載image為空");
}
return image;
}
下面介紹runtime方法交換
類別也走load 方法所以 我們在進行runtime交換方法的時候要在load方法里實現
+(void)load
{
//獲取方法實現
//class_getMethodImplementation(<#__unsafe_unretained Class cls#>, <#SEL name#>)
//獲取對象方法
// class_getInstanceMethod(, <#SEL name#>)
//獲取類方法
//class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)
//交換方法實現
Method imageNameMetha=class_getClassMethod([UIImage class], @selector(imageNamed:));
Method imageNameSJmetha=class_getClassMethod([UIImage class], @selector(SJ_imageNamed:));
//exchange:交換
method_exchangeImplementations(imageNameMetha, imageNameSJmetha);
}