• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Objective-c防止数组越界而崩溃(全局效果)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

数组越界其实是很基本的问题,但是解决起来除了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 

https://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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
objective-C中类似于C#中trim的方法(去掉字符串前后空格)发布时间:2022-07-12
下一篇:
关于Objective-C2.0的垃圾收集发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap