参考文章:
iOS黑魔法-Method Swizzling
一、什么是Method Swizzling?
每一个继承于NSObject的类都能自动获得runtime的支持。在这样的一个类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器编译时为类(需继承于NSObject)创建的.在这个结构体中有包括了指向其父类类定义的指针以及 Dispatch table. Dispatch table是一张SEL和IMP的对应表。
method swizzling 其实就是通过修改这个dispathc table 表来修改SEL对应的IMP,从而实现方法实现的修改。
[轻松学习之 IMP指针的作用](http://ww
w.cocoachina.com/ios/20150717/12623.html)
iOS中的SEl和IMP到底是什么
二、怎么使用?
下面是为NSArray写的一个小demo,用来重新实现NSMutableArray的addObject方法,使其在添加的obj为nil时也不会崩溃。
+ (void)load
{
[super load];
Method originMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(addObject:));
Method realMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), @selector(swizzling_addObject:));
method_exchangeImplementations(originMethod, realMethod);
}
//如果是空的话,不做任何处理,但是程序不会崩溃
- (void)swizzling_addObject:(id)obj
{
if (!obj) {
@try{
[self swizzling_addObject:obj];
}
@catch (NSException *exception){
NSLog(@"---------- %s Crash Because Method %s ----------\n", class_getName(self.class), __func__);
NSLog(@"%@", [exception callStackSymbols]);
}
@finally {}
}else{
[self swizzling_addObject:obj];
}
}
三、其他
另外推荐一个封装好的Method Swizzling 扩展。
jrswizzle
网友评论