美文网首页
Objective-C runtime 方法交换

Objective-C runtime 方法交换

作者: 1234yws | 来源:发表于2016-10-20 10:22 被阅读11次
    
    // 方法交换
    #import "NSMutableArray+Category.h"
    #import <objc/runtime.h>
    @implementation NSMutableArray (Category)
    
    + (void)load
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            SEL originalSelector = @selector(addObject:);//系统方法
            SEL swizzledSelector = @selector(ws_addObject:);//自定义方法
            
            // NSMutableArray是类簇,真正的类名是__NSArrayM。
            Method originalMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), originalSelector);
            Method swizzledMethod = class_getInstanceMethod(objc_getClass("__NSArrayM"), swizzledSelector);
            
            if (!originalMethod)//指定方法名
            {
                NSLog(@"original method %@ not found for class %@", NSStringFromSelector(originalSelector), [self class]);
            }
            
            if (!swizzledMethod)//指定方法
            {
                NSLog(@"swizzled method %@ not found for class %@", NSStringFromSelector(swizzledSelector), [self class]);
            }
            
            BOOL didAddMethod = class_addMethod(self,
                                                originalSelector,
                                                method_getImplementation(swizzledMethod),
                                                method_getTypeEncoding(swizzledMethod));
            
            if (didAddMethod)
            {
                class_replaceMethod(self,
                                    swizzledSelector,
                                    method_getImplementation(originalMethod),
                                    method_getTypeEncoding(originalMethod));
            }
            else
            {
                method_exchangeImplementations(originalMethod, swizzledMethod);
            }
            
        });
    }
    
    - (void)ws_addObject:(id)object
    {
        if (object != nil)
        {
            [self ws_addObject:object];
        }
    }
    
    @end
    
    

    防止数组为nil 程序崩溃

    相关文章

      网友评论

          本文标题:Objective-C runtime 方法交换

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