iOS开发中需要大量对dictionary和array进行操作,因此我们需要一种更加安全可靠的操作方法来避免不必要的crash。当然可以通过自定义dictionary 和array重载增删改查的方法来避免crash,但是由于许多工程基本成型以后,如此操作的话工作量,改动等都会很大。此时我们可以利用OC语言动态特性对数组和字典的增删改查方法进行Method Swizzling(不懂得自行百度吧) ,替换成我们经过安全操作的方法,从而进行安全操作。当然有好多大神已经实现过了,但是毕竟会用并不代表是自己的。好了废话不多说吧,下面我们就开始自己动手一步步实现我们自己的safe类吧。

一. 首先第一步我们需要知道字典和素组进行操作(也支持字面量操作)崩溃的原因有哪些:

  1. 不可变数组NSArray 常用的方法有 objectAtIndex objectAtIndexedSubscript arrayByAddingObject arrayWithObject

    主要的crash reason是数组越界,运行一下代码


    程序崩溃 看下日志reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]

    运行下面代码 数组中追加了一个nil值

    程序崩溃日志reason: '*** -[NSArray arrayByAddingObject:]: object cannot be nil'

    运行代码NSArray * testArray = [NSArray arrayWithObject:nil];崩溃日志reason: '*** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[0]

  2. 可变数组常用方法 增删改查等 主要有
    1.[__NSPlaceholderArray initWithObjects:count:] 2.[__NSArrayM insertObject:atIndex:] 3.[__NSArrayM objectAtIndex:] 4.[__NSArrayM removeObjectAtIndex:] 5.[__NSArrayM replaceObjectAtIndex:withObject:] 6.[NSMutableArray replaceObjectsInRange:withObjectsFromArray:]
  3. 不可变字典 初始化有空值 [__NSPlaceholderDictionary initWithObjects:forKeys:count:]
  4. 可变字典常用方法setObject: forKey: removeObjectsForKeys: removeObjectForKey: 进行操作是key value 不能为nil

二. 第二步我们利用runtime在实现load方法( + load 方法,那么当类被加载时它会自动被调用)时将这些方法进行hook,注意方法进行Swizzling时候程序生命周期内只需要执行一次:

对NSArray举例实现一下
1\.新建NSArray的categary NSArray+Safe
当数组越界时 crash reason[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2] 我们需要使用函数method_exchangeImplementations(method1,method2)交换两个方法的实现指针 因为交换指针需要多次使用,我们对此方法进行封装
如下图:

实现一下load函数
如下图


实现我们自定义的方法
如下图
 
 
ok,数组越界已经解决了!可以试一下啦!

其他的都是大同小异,下面是我的github地址,将库拖到工程里边就可以啦!

iOS 数组字典操作的更多相关文章

  1. oc字符串+数组+字典操作题目

    1. 判断中间目录是否存在 (10分) 比如 传入字符串 @"/home/qianfeng/oc.txt" 和 @"qianfeng" 返回:YES 传入字符串 ...

  2. iOS 数组集合操作(交集,并集,差集,子集)

    1.求数组的 交集,并集,差集 NSArray *array1 = @[@"1",@"2",@"3"]; NSArray *array2 = ...

  3. iOS - 数组字典模型根据模型属性key排序

    方法一: NSArray *sortArray = [arrayM sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { ...

  4. [BS-02] iOS数组、字典、NSNumber 新写法—— @[]、@{}

    IOS数组.字典.NSNumber 新写法—— @[].@{}   //标准写法 NSNumber * number = [NSNumber numberWithInt:]; NSArray * ar ...

  5. Python学习笔记5-字符串、bool、数值操作和数组字典排序

    1.字符串 # 字符串数字之间转换 # x = int("6") # print type(x) #<type 'str'> # y = str(6) # print ...

  6. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

  7. @proprety数组字典字符串用copy和strong区别(深浅拷贝)

    ////  @proprety数组字典字符串用copy和strong区别(深浅拷贝).h//  IOS笔记//// /* _proprety________copy_strong_________h ...

  8. [jQuery学习系列三 ]3-JQuery学习二-字典操作

    前言:如果看过了第一篇和第二篇, 相信大家会对jQuery有个初步的认识了, 对于jQuery的选择器和数组的操作都已经很熟悉了, 这一篇就单独罗列jQuery中字典的操作相关的内容. 1. 数组中添 ...

  9. NSNumber(把数字存进数组字典等的问题)

    官方文档地址https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNum ...

随机推荐

  1. Kafka单机版安装(CentOS 7环境下)

    一.环境操作系统和软件版本介绍 1.环境操作系统为CentOS Linux release 7.2.1511 (Core) 可用cat /etc/redhat-release查询 2.软件版本 Kaf ...

  2. moodle笔记之-数据库操作

    <?php require_once('../config.php'); // config.php under root folder require_once($CFG->dirroo ...

  3. Js控制iphone端的input/textarea元素失去焦点时隐藏键盘

    原文http://www.it165.net/pro/html/201404/12672.html function objBlur(obj, time){ if(typeof obj != 'str ...

  4. 主题模型 利用gibbslda做数据集主题抽样

    电子科技大学电子商务实验室Kai Yip,欢迎同行指正,也欢迎互相指导,学习. 广告打完,进入正题. 关于程序运行结果的分析请参照我的另一篇博客:http://www.cnblogs.com/nlp- ...

  5. PAT乙级1027. 打印沙漏(20)

    本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行符号中心对齐:相邻两 ...

  6. dplyr 数据操作 常用函数(4)

    接下来我们继续了解一些dplyr中的常用函数. 1.ranking 以下各个函数可以实现对数据进行不同的排序 row_number(x) ntile(x, n) min_rank(x) dense_r ...

  7. angular js一探

    下一代angular js. 概念:mvc:作为dataModel的$scope. 还必须导入angular的库. ng-app:告诉angular引擎从这里开始是他因该管理的内容.(引入之后,可以在 ...

  8. [SOJ] Ordering Tasks

    1940. Ordering Tasks Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description John has n task ...

  9. 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 转载

    最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在chrome,firefox,safari,opera,360浏览器(极速模式).搜狗浏览器等浏览器下均没 ...

  10. Python基础(十一)-面向对象

    三种编程范式: 1.函数式编程:函数指数学意义上的函数 由于命令式编程语言也可以通过类似函数指针的方式来实现高阶函数,函数式的最主要的好处主要是不可变性带来的.没有可变的状态,函数就是引用透明(Ref ...