zoukankan      html  css  js  c++  java
  • iOS开发NSMutableArray数组越界处理

    #import "NSArray+CrashArray.h"
    #import <objc/runtime.h>
    @implementation NSObject (Until)
    
    - (void)swizzleMethod:(SEL)originalSelector swizzledSelector:(SEL)swizzledSelector{
        Class class = [self class];
        Method original = class_getInstanceMethod(class, originalSelector);
        Method Swizzl   = class_getInstanceMethod(class, swizzledSelector);
        
        BOOL didAdd = class_addMethod(class, originalSelector, method_getImplementation(Swizzl), method_getTypeEncoding(Swizzl));
        if (didAdd) {
            class_replaceMethod(class, swizzledSelector, method_getImplementation(original), method_getTypeEncoding(original));
        }else{
            method_exchangeImplementations(original, Swizzl);
        }
    }
    
    @end
    @implementation NSArray (CrashArray)
    
    
    - (id)safeObjectAtIndex:(NSUInteger)index{
        if (index<self.count) {
            return [self safeObjectAtIndex:index];
        }else{
    //#ifdef DEBUG
    //        NSAssert(NO, @"index %lu > count %lu",(unsigned long)index,(unsigned long)self.count);
    //#endif
            return nil;
        }
    }
    - (id)safeObjectAtIndex1:(NSUInteger)index{
        if (index<self.count) {
            return [self safeObjectAtIndex1:index];
        }else{
    //#ifdef DEBUG
    //        NSAssert(NO, @"index %lu > count %lu",(unsigned long)index,(unsigned long)self.count);
    //#endif
            return nil;
        }
    }
    - (id)safeObjectAtIndex2:(NSUInteger)index{
        if (index<self.count) {
            return [self safeObjectAtIndex2:index];
        }else{
    //#ifdef DEBUG
    //        NSAssert(NO, @"index %lu > count %lu",(unsigned long)index,(unsigned long)self.count);
    //#endif
            return nil;
        }
    }
    - (id)safeObjectAtIndex3:(NSUInteger)index{
        if (index<self.count) {
            return [self safeObjectAtIndex3:index];
        }else{
    //#ifdef DEBUG
    //        NSAssert(NO, @"index %lu > count %lu",(unsigned long)index,(unsigned long)self.count);
    //#endif
            return nil;
        }
    }
    
    + (void)load{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            @autoreleasepool {
                [objc_getClass("__NSArrayI") swizzleMethod:@selector(objectAtIndex:) swizzledSelector:@selector(safeObjectAtIndex:)];
                [objc_getClass("__NSArrayI") swizzleMethod:@selector(objectAtIndexedSubscript:) swizzledSelector:@selector(safeObjectAtIndex1:)];
    
                [objc_getClass("__NSArrayM") swizzleMethod:@selector(objectAtIndex:) swizzledSelector:@selector(safeObjectAtIndex2:)];
                [objc_getClass("__NSArrayM") swizzleMethod:@selector(objectAtIndexedSubscript:) swizzledSelector:@selector(safeObjectAtIndex3:)];
            }
        });
    }
    @end
    @implementation NSDictionary(DictinaryCrash)
    
    
    - (void)mutableSetObject:(id)obj forKey:(NSString *)key{
        if (obj && key) {
            [self mutableSetObject:obj forKey:key];
        }
    }
    + (void)load{
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            @autoreleasepool{
                [objc_getClass("__NSDictionaryM") swizzleMethod:@selector(setObject:forKey:) swizzledSelector:@selector(mutableSetObject:forKey:)];
            }
        });
    }
    @end
  • 相关阅读:
    iphone dev 入门实例5:Get the User Location & Address in iPhone App
    iphone dev 入门实例4:CoreData入门
    iphone dev 入门实例3:Delete a Row from UITableView
    iphone dev 入门实例2:Pass Data Between View Controllers using segue
    iphone dev 入门实例1:Use Storyboards to Build Table View
    Learning Core Data 1
    Apple dev travel
    数字信封工作原理
    Linux编程概念
    ubuntu16.04 安装 libnfc
  • 原文地址:https://www.cnblogs.com/xianfeng-zhang/p/9341325.html
Copyright © 2011-2022 走看看