【iOS开发】Method Swizzling

参考文章:
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

你可能感兴趣的:(【iOS开发】Method Swizzling)