iOS中防止数组越界之后发生崩溃

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/56011127

在iOS开发中有时会遇到数组越界的问题,从而导致程序崩溃。为了防止程序崩溃,我们就要对数组越界进行处理。通过上网查资料,发现可以通过为数组写一个分类来解决此问题。

基本思路:为NSArray写一个防止数组越界的分类。分类中利用runtime将系统中NSArray的对象方法objectAtIndex:替换,然后对objectAtIndex:传递过来的下标进行判断,如果发生数组越界就返回nil,如果没有发生越界,就继续调用系统的objectAtIndex:方法。

代码:

.h文件:

#import <Foundation/Foundation.h>

#import <objc/runtime.h>

@interface NSArray (beyond)

@end

.m文件:

#import "NSArray+beyond.h"

@implementation NSArray (beyond)

+ (void)load{

    [superload];

     //  替换不可变数组中的方法

Method oldObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(objectAtIndex:));

Method newObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayI"),@selector(__nickyTsui__objectAtIndex:));

method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex);

//  替换可变数组中的方法

Method oldMutableObjectAtIndex =class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(objectAtIndex:));

Method newMutableObjectAtIndex = class_getInstanceMethod(objc_getClass("__NSArrayM"),@selector(mutableObjectAtIndex:));

method_exchangeImplementations(oldMutableObjectAtIndex, newMutableObjectAtIndex);

}

- (id)__nickyTsui__objectAtIndex:(NSUInteger)index{

if (index >self.count -1 || !self.count){

@try {

return [self__nickyTsui__objectAtIndex:index];

        } @catch (NSException *exception) {

//__throwOutException  抛出异常

NSLog(@"数组越界...");

returnnil;

        } @finally {

        }

    }

else{

return [self__nickyTsui__objectAtIndex:index];

    }

}

- (id)mutableObjectAtIndex:(NSUInteger)index{

if (index >self.count -1 || !self.count){

@try {

return [selfmutableObjectAtIndex:index];

        } @catch (NSException *exception) {

//__throwOutException  抛出异常

NSLog(@"数组越界...");

returnnil;

        } @finally {

        }

    }

else{

return [selfmutableObjectAtIndex:index];

    }

}

@

2018.06.01更新:

这里有一个防止数组越界崩溃的升级版,即使arr[index]这种情况下产生的崩溃也能防止。

传送门:https://www.jianshu.com/writer#/notebooks/2349590/notes/28096621

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ios 技术积累

ios ARC中如何判断一个对象释放了

NSHashTable效仿了NSSet(NSMutableSet),但提供了比NSSet更多的操作选项,尤其是在对弱引用关系的支持上,NSHashTable在对...

30020
来自专栏青玉伏案

Objective-C中把数组中字典中的数据转换成URL

        可能上面的标题有些拗口,学过PHP的小伙伴们都知道,PHP中的数组的下标是允许我们自定义的,PHP中的数组确切的说就是键值对。而在OC我们要用字...

269100
来自专栏c#开发者

一种自动的将自定义类序列化为JSON的方法

最近因为项目需求,需要将一些自定义的类序列化为JSON,网上有很多好用的第三方序列化工具,但都只能自动序列化一些基本类型,如NSNumber,NSString与...

38770
来自专栏IMWeb前端团队

Promise的简单实现

本篇文章通过构建一个简单的Promise对象来了解如何做到异步获得数据。 使用方法 const fetch = function(url) { return...

23190
来自专栏菩提树下的杨过

objective-C中的Class(类类型),Selector(选择器SEL),函数指针(IMP)

今天在园子里看到了一篇牛文“Objective-C 2.0 with Cocoa Foundation--- 5,Class类型,选择器Selector以及函数...

24450
来自专栏Scott_Mr 个人专栏

利用Runtime实现简单的字典转模型

39960
来自专栏陈满iOS

iOS开发·runtime+KVC实现多层字典模型转换(多层数据:模型嵌套模型,模型嵌套数组,数组嵌套模型)

更重要的是,有时候在iOS面试的时候,部分面试官会不仅问你某种场景会用到什么框架,更会问你如果要你来实现这个功能,你有没有解决思路?所以,自己实现字典转模型还是...

37410
来自专栏BY的专栏

Objective-C Runtime 的一些基本使用

36980
来自专栏ShaoYL

IOS开发系列—Objective-C之Foundation框架

21460
来自专栏DannyHoo的专栏

iOS开发中子类指针指向父类指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

14820

扫码关注云+社区

领取腾讯云代金券