在OC編碼中,有一種黑魔法挡闰,當(dāng)你想截獲一個(gè)方法,想在這個(gè)方法中添加一點(diǎn)你需要的東西赞季,但是又不能改這個(gè)這個(gè)方法奢驯∩旯常可以利用runtime中的方法獲取這個(gè)方法瘪阁,通過方法轉(zhuǎn)換邮偎,把你的方法插入到這個(gè)方法中去义黎。
//
SEL originalSelector = @selector(actionForLayer:forKey:);
SEL extendedSelector = @selector(DR_actionForLayer:forKey:);
Method originalMethod = class_getInstanceMethod(self, originalSelector);
Method extendedMethod = class_getInstanceMethod(self, extendedSelector);
NSAssert(originalMethod, @"original method should exist");
NSAssert(extendedMethod, @"exchanged method should exist");
if(class_addMethod(self, originalSelector, method_getImplementation(extendedMethod), method_getTypeEncoding(extendedMethod))) {
class_replaceMethod(self, extendedSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, extendedMethod);
}
或者用下面的方法
+(void)load{
/** 獲取原始setBackgroundColor方法 */
Method originalM = class_getInstanceMethod([self class], @selector(setBackgroundColor:));
/** 獲取自定義的pb_setBackgroundColor方法 */
Method exchangeM = class_getInstanceMethod([self class], @selector(pb_setBackgroundColor:));
/** 交換方法 */
method_exchangeImplementations(originalM, exchangeM);
}
/** 自定義的方法 */
-(void)pb_setBackgroundColor:(UIColor *) color{
NSLog(@"%s",__FUNCTION__);
/**
1.更改顏色
2.所有繼承自UIView的控件,設(shè)置背景色都會(huì)設(shè)置成自定義的'orangeColor'
3. 此時(shí)調(diào)用的方法 'pb_setBackgroundColor' 相當(dāng)于調(diào)用系統(tǒng)的 'setBackgroundColor' 方法,原因是在load方法中進(jìn)行了方法交換.
4. 注意:此處并沒有遞歸操作.
*/
[self pb_setBackgroundColor:[UIColor orangeColor]];
}