美文网首页
【iOS开发】Method Swizzling

【iOS开发】Method Swizzling

作者: xiacheng | 来源:发表于2017-01-04 19:36 被阅读27次

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

          本文链接:https://www.haomeiwen.com/subject/wbcnvttx.html