美文网首页
runtime 交换方法应用

runtime 交换方法应用

作者: 晨阳Xia | 来源:发表于2021-03-16 16:08 被阅读0次

解决数组添加空值崩溃

#import "NSMutableArray+Extension.h"
#import <objc/runtime.h>

@implementation NSMutableArray (Extension)

+ (void)load {
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class cls = NSClassFromString(@"__NSArrayM");
        Method addMethod = class_getInstanceMethod(cls, @selector(addObject:));
        Method changeAddMethod = class_getInstanceMethod(cls, @selector(xsy_addObject:));
        method_exchangeImplementations(addMethod, changeAddMethod);
        
        Method insertMetod = class_getInstanceMethod(cls, @selector(insertObject:atIndex:));
        Method changeInsertMethod = class_getInstanceMethod(cls, @selector(xsy_insertObject:atIndex:));
        method_exchangeImplementations(insertMetod, changeInsertMethod);
    });
    
    
}

- (void)xsy_addObject:(id)anObject {
    if (anObject == nil) {
        NSLog(@"小子,你敢往里添加空值");
        return;
    }
    [self xsy_addObject:anObject];
}



- (void)xsy_insertObject:(id)anObject atIndex:(NSUInteger)index {
    if (anObject == nil) {
        NSLog(@"小子,你敢往第%lu个元素里添加空值",(unsigned long)index);
        return;
    }
    [self xsy_insertObject:anObject atIndex:index];
}

@end

解决字典添加空值崩溃

#import "NSMutableDictionary+Extection.h"
#import <objc/runtime.h>

@implementation NSMutableDictionary (Extection)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class mcls = NSClassFromString(@"__NSDictionaryM");
        Method setMethod = class_getInstanceMethod(mcls, @selector(setObject:forKeyedSubscript:));
        Method changeSetMethod = class_getInstanceMethod(mcls, @selector(xsy_setObject:forKeyedSubscript:));
        method_exchangeImplementations(setMethod, changeSetMethod);
        
    });
}

- (void)xsy_setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key {
    if (obj == nil) {
        NSLog(@"%@对应的值为nil",key);
        return;
    }
    [self xsy_setObject:obj forKeyedSubscript:key];
}

@end

监控点击事件

#import "UIControl+Extection.h"
#import <objc/runtime.h>

@implementation UIControl (Extection)

+ (void)load {
    Method method = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
    Method changeMethod = class_getInstanceMethod(self, @selector(xsy_sendSendAction:to:forEvent:));
    method_exchangeImplementations(method, changeMethod);
    
}

- (void)xsy_sendSendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    NSLog(@"%@-%@-%@",NSStringFromSelector(action), target, event);
    [self xsy_sendSendAction:action to:target forEvent:event];
}

@end

相关文章

  • iOS -- runtime的应用

    runtime主要有一下几种应用场景 方法交换 添加属性 (一)方法交换 (1)字体适配 方法交换实际交换的是方法...

  • runtime 交换方法应用

    解决数组添加空值崩溃 解决字典添加空值崩溃 监控点击事件

  • runtime

    runtime交换方法 动态添加方法

  • runTime常用方法

    使用runTime改变实例成员的值 使用runtime来交换两个方法 注意再次调用该方法不交换 使用runTime...

  • Runtime

    runtime运行时机制1:通过runtime,实现方法交换(交换两个类方法、交换两个实例方法)2:通过runti...

  • Day3

    1 runtime运行时机制1:通过runtime,实现方法交换(交换两个类方法、交换两个实例方法)。2:通过ru...

  • runtime的理解(二)

    主要内容 利用 runtime 交换方法 利用 runtime 动态添加方法 利用 runtime 动态添加属性 ...

  • 查看SDK调用支付宝参数

    使用runtime 方法交换openurl

  • 自己实现OC的KVO

    Runtime系列文章在这:Runtime介绍---术语介绍Runtime应用--动态添加方法Runtime应用-...

  • objc runtime (四)动态添加属性

    在《objc runtime (二)交换方法》中我提到过runtime最实用的就是交换方法和动态添加属性两个用法。...

网友评论

      本文标题:runtime 交换方法应用

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