iOS 数组字典操作
iOS开发中需要大量对dictionary和array进行操作,因此我们需要一种更加安全可靠的操作方法来避免不必要的crash。当然可以通过自定义dictionary 和array重载增删改查的方法来避免crash,但是由于许多工程基本成型以后,如此操作的话工作量,改动等都会很大。此时我们可以利用OC语言动态特性对数组和字典的增删改查方法进行Method Swizzling(不懂得自行百度吧) ,替换成我们经过安全操作的方法,从而进行安全操作。当然有好多大神已经实现过了,但是毕竟会用并不代表是自己的。好了废话不多说吧,下面我们就开始自己动手一步步实现我们自己的safe类吧。
一. 首先第一步我们需要知道字典和素组进行操作(也支持字面量操作)崩溃的原因有哪些:
- 不可变数组NSArray 常用的方法有
objectAtIndexobjectAtIndexedSubscriptarrayByAddingObjectarrayWithObject主要的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] - 可变数组常用方法 增删改查等 主要有
1.[__NSPlaceholderArray initWithObjects:count:] 2.[__NSArrayM insertObject:atIndex:] 3.[__NSArrayM objectAtIndex:] 4.[__NSArrayM removeObjectAtIndex:] 5.[__NSArrayM replaceObjectAtIndex:withObject:] 6.[NSMutableArray replaceObjectsInRange:withObjectsFromArray:] - 不可变字典 初始化有空值
[__NSPlaceholderDictionary initWithObjects:forKeys:count:] - 可变字典常用方法
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函数
如下图

实现我们自定义的方法
如下图

其他的都是大同小异,下面是我的github地址,将库拖到工程里边就可以啦!
iOS 数组字典操作的更多相关文章
- oc字符串+数组+字典操作题目
1. 判断中间目录是否存在 (10分) 比如 传入字符串 @"/home/qianfeng/oc.txt" 和 @"qianfeng" 返回:YES 传入字符串 ...
- iOS 数组集合操作(交集,并集,差集,子集)
1.求数组的 交集,并集,差集 NSArray *array1 = @[@"1",@"2",@"3"]; NSArray *array2 = ...
- iOS - 数组字典模型根据模型属性key排序
方法一: NSArray *sortArray = [arrayM sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { ...
- [BS-02] iOS数组、字典、NSNumber 新写法—— @[]、@{}
IOS数组.字典.NSNumber 新写法—— @[].@{} //标准写法 NSNumber * number = [NSNumber numberWithInt:]; NSArray * ar ...
- Python学习笔记5-字符串、bool、数值操作和数组字典排序
1.字符串 # 字符串数字之间转换 # x = int("6") # print type(x) #<type 'str'> # y = str(6) # print ...
- Swift语法基础入门二(数组, 字典, 字符串)
Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...
- @proprety数组字典字符串用copy和strong区别(深浅拷贝)
//// @proprety数组字典字符串用copy和strong区别(深浅拷贝).h// IOS笔记//// /* _proprety________copy_strong_________h ...
- [jQuery学习系列三 ]3-JQuery学习二-字典操作
前言:如果看过了第一篇和第二篇, 相信大家会对jQuery有个初步的认识了, 对于jQuery的选择器和数组的操作都已经很熟悉了, 这一篇就单独罗列jQuery中字典的操作相关的内容. 1. 数组中添 ...
- NSNumber(把数字存进数组字典等的问题)
官方文档地址https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSNum ...
随机推荐
- JDBC连接sql server数据库操作
1.首先,先创建一个连接数据库的工具类: package gu.db.util; import java.sql.Connection; import java.sql.DriverManager; ...
- Symfony官方视频教程
视频获取方式,添加Symfony学习群,在群文件中获取,QQ群182983780
- SQL 默认数据库被误删
我今天也遇到了,自己解决了.这是我总结的:(不管这帖子沉到哪里了) 删除了SQL服务器默认数据库,无法连接服务器,用户[]登录失败. 1,使用管理员账户修改此用户的默认数据库. 企业管理器,展开 ...
- eclipse 启动tomcat后 页面无法访问tomcat首页
在eclipse中新建tomcat7,完成后tomcat能够正常启动,但是浏览器问题localhost:8080访问不了. 解决方法如下: 双击eclipse中服务器中的tomcat 出现tomcat ...
- VS发布网站步骤(先在vs上发布网站到新的文件夹,然后挂到iis上面)
VS发布网站步骤(先在vs上发布网站到新的文件夹,然后挂到iis上面) 首先用vs2010打开一个Asp.Net项目, 也可以通过vs菜单->生成->发布网站 选择发布网站的路径 ...
- ES CPU和磁盘IO升高
问题 ES监控出现偶尔的波动,CPU和磁盘IO升高 有时候在凌晨,业务请求比较低,也没有慢查询,GC也比较正常,没有出现Full GC ES内部的merge segment会占用CPU和磁盘资源,怀疑 ...
- 架设自己的FTP服务器 Serv-U详细配置图文教程
转自:http://www.jb51.net/article/31635.htm 所有不是很要求安全的情况下是可以用serv_U的,当然我们也可以通过一些设置,保证serv_u安全运行.这里就分享下s ...
- js-轮播图
<!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" charset ...
- 【Shell】Linux中分区脚本
后天要中期答辩了,今天只刷了一个题,还没写出来,但是想更新博客,所以只有把之前写的东西贴出来了. 一个用于分区的shell脚本 1 #!/bin/bash #指定脚本解释器路径 2 echo &quo ...
- 【LeetCode】459. Repeated Substring Pattern
Given a non-empty string check if it can be constructed by taking a substring of it and appending mu ...