美文网首页
数组字典防止插入空值导致crash、监听点击事件

数组字典防止插入空值导致crash、监听点击事件

作者: zhouluyao | 来源:发表于2020-04-11 18:02 被阅读0次

    监听按钮点击事件可以通过给UIControl添加分类实现

    #import <objc/runtime.h>
    @implementation UIControl (Extension)
    
    + (void)load
    {
        // hook:钩子函数
        Method method1 = class_getInstanceMethod(self, @selector(sendAction:to:forEvent:));
        Method method2 = class_getInstanceMethod(self, @selector(mj_sendAction:to:forEvent:));
        method_exchangeImplementations(method1, method2);
    }
    
    - (void)mj_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event
    {
        NSLog(@"%@-%@-%@", self, target, NSStringFromSelector(action));
        
        // 调用系统原来的实现
        [self mj_sendAction:action to:target forEvent:event];
        
    //    [target performSelector:action];
        
    //    if ([self isKindOfClass:[UIButton class]]) {
    //        // 拦截了所有按钮的事件
    //
    //    }
    }
    

    为NSMutableArray添加分类

    #import <objc/runtime.h>
    
    @implementation NSMutableArray (Extension)
    
    + (void)load
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            // 类簇:NSString、NSArray、NSDictionary,真实类型是其他类型
            Class cls = NSClassFromString(@"__NSArrayM");
            Method method1 = class_getInstanceMethod(cls, @selector(insertObject:atIndex:));
            Method method2 = class_getInstanceMethod(cls, @selector(mj_insertObject:atIndex:));
            method_exchangeImplementations(method1, method2);
        });
    }
    
    - (void)mj_insertObject:(id)anObject atIndex:(NSUInteger)index
    {
        if (anObject == nil) return;
        [self mj_insertObject:anObject atIndex:index];
    }
    

    为NSMutableDictionary添加分类?

    #import <objc/runtime.h>
    
    @implementation NSMutableDictionary (Extension)
    
    + (void)load
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            Class cls = NSClassFromString(@"__NSDictionaryM");
            Method method1 = class_getInstanceMethod(cls, @selector(setObject:forKeyedSubscript:));
            Method method2 = class_getInstanceMethod(cls, @selector(mj_setObject:forKeyedSubscript:));
            method_exchangeImplementations(method1, method2);
            
            Class cls2 = NSClassFromString(@"__NSDictionaryI");
            Method method3 = class_getInstanceMethod(cls2, @selector(objectForKeyedSubscript:));
            Method method4 = class_getInstanceMethod(cls2, @selector(mj_objectForKeyedSubscript:));
            method_exchangeImplementations(method3, method4);
        });
    }
    
    - (void)mj_setObject:(id)obj forKeyedSubscript:(id<NSCopying>)key
    {
        if (!key) return;
        
        [self mj_setObject:obj forKeyedSubscript:key];
    }
    
    - (id)mj_objectForKeyedSubscript:(id)key
    {
        if (!key) return nil;
        
        return [self mj_objectForKeyedSubscript:key];
    }
    

    相关文章

      网友评论

          本文标题:数组字典防止插入空值导致crash、监听点击事件

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