zoukankan      html  css  js  c++  java
  • Objective-c防止数组越界而崩溃(全局效果)

    数组越界其实是很基本的问题,但是解决起来除了count的判断,还有每个调用的时候都要去判断一遍

    对于不明确的数据总会有崩溃的风险

    然而 每次调用都判断 那是太累了

    so 。。runtime&category提供了一个比较简洁的解决方案

    首先把NSArray/NSMutableArray的objectAtIndex方法通过objc的runtime 里面method swizzle把方法进行替换

    + (void)load{
        [super load];
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{  //方法交换只要一次就好
            Method oldObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(objectAtIndex:));
            Method newObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayI"), @selector(__nickyTsui__objectAtIndex:));
            method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex);
        });
    }

    可以看到 旧方法跟新方法的名字(在上面两个selector里面)

    接着写上新方法即可

    在新方法里面做越界判断

    - (id)__nickyTsui__objectAtIndex:(NSUInteger)index{
        if (index > self.count - 1 || !self.count){
            @try {
                return [self __nickyTsui__objectAtIndex:index];
            } @catch (NSException *exception) {
                //__throwOutException  抛出异常
                return nil;
            } @finally {
                
            }
        }
        else{
            return [self __nickyTsui__objectAtIndex:index];
        }
    }

    把这个NSArray的category加到pch就好了。。

    demo 

    http://files.cnblogs.com/files/n1ckyxu/ArrayBoundsDemo.zip

    请注意! 最近发现的一个小问题,对NSArray hook后会产生系统键盘会被ARC释放掉从而产生zombie memory,导致闪退的问题

    具体情况: iOS8下 随机激活一个textfield/textview 键盘出现后,按home键使app进入后台,app随即闪退

    解决方案:在工程配置中 设置这个NSArray的Category的.m文件使用mrc运行, 配置加上 -fno-objc-arc

  • 相关阅读:
    python pycurl属性
    HTTP报文-->MVC
    国际化信息-->MVC
    计算机网络入门概念理解
    TCP/IP基础概念及通信过程举例
    一道面试题:说说进程和线程的区别
    【转载】我眼中的Oracle性能优化
    【转载】数据库范式那些事
    【转载】详解CreateProcess调用内核创建进程的过程
    数据结构和算法(一):hash散列容器
  • 原文地址:https://www.cnblogs.com/n1ckyxu/p/6047556.html
Copyright © 2011-2022 走看看