iOS DeveloperiOS 开发

ios拓展24-runtime交换方法

2016-08-23  本文已影响53人  Abler

runtime交换方法,这里以UIImage的 imageNamed 方法为例, 创建UIImage分类

+ (void)load {// 加载分类的时候调用,不导入头文件,也会交换 
    // 获取原始的方法
    Method originMethod = class_getClassMethod([UIImage class], @selector(imageNamed:));
    // 获取新的方法
    Method newMethod = class_getClassMethod([UIImage class], @selector(customImageNamed:));
    // 交换方法
    method_exchangeImplementations(originMethod, newMethod);
}

// 获取对象方法
//class_getInstanceMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)
// 获取类方法
//class_getClassMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>)
+ (UIImage *)customImageNamed:(NSString *)name {  
    NSString *skinFolderPath = [NSString stringWithFormat:@"%@",[NSBundle mainBundle].resourcePath];

    NSString *path = nil;
    if([name hasSuffix:@".png"]) {
        path = [NSString stringWithFormat:@"%@/%@",skinFolderPath,name];
    } else {
        path = [NSString stringWithFormat:@"%@/%@.png",skinFolderPath,name];
    }
    UIImage *image = [UIImage imageWithContentsOfFile:path];
    if(image == nil) {
/*==================================*/
// 由于方法交换了,这里不能用  image =[UIImage imageNamed:name];
/*==================================*/
        image = [UIImage customImageNamed:name];
    }
    return image;
}
self.imageView.image = [UIImage imageNamed:@"name"];
上一篇下一篇

猜你喜欢

热点阅读