IOS 中runtime 不可变数组__NSArray0 和__NSArrayI

大家可能都遇到过项目中不可变数组避免数组越界的处理:runtime,然而有时候并不能解决所有的问题,因为类簇不一样

#import "NSArray+Security.h"

#import "NSObject+Swizzling.h"

@implementation NSArray (Security)

+ (void)load {

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

[objc_getClass("__NSArray0") methodSwizzlingWithOriginalSelector:@selector(objectAtIndex:) bySwizzledSelector:@selector(safeObjectAtIndex:)];

});

}

- (id)safeObjectAtIndex:(NSUInteger)index {

if (self.count == 0) {

NSLog(@"%s can't get any object from an empty array", __FUNCTION__);

return nil;

}

if (index > self.count) {

NSLog(@"%s index out of bounds in array", __FUNCTION__);

return nil;

}

return [self safeObjectAtIndex:index];

}

@end

但是不同的创建数组的方法导致不同的类簇(其实也就是不同的指针),下面我们就看

NSArray *arr1 =  @[@"1",@"2"];

NSArray *arr2 =  [[NSArray alloc]init];

NSArray *arr2 =  [[NSArray alloc]initwithobjocts:@"1",nil];

NSArray *arr3 =  [NSArray alloc];

NSMutbleArray *arr4 =  [NSMutbleArray array];

你会发现:

1、arr2类名叫_NSArray0
2、未init的arr3,类名叫做_NSPlaceHolderArray;
3、初始化后的可变数组类名都叫_NSArrayM;
4、初始化后的不可变数组类名都叫_NSArrayI.

所以做runtime处理的话要谨慎用!

IOS 中runtime 不可变数组__NSArray0 和__NSArrayI相关推荐

  1. ios 替换数组中元素_ios可变数组的所有操作

    #pragma mark 创建数组c NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@& ...

  2. iOS 多线程安全 与可变数组

    完全来自于 iOS 多线程安全与可变字典 的学习 基本相同,举一反三 直接上样例代码 是我参照网上,根据当前业务需求改的. 其实好多人在这里喜欢用类别处理.我个人觉得用类别 极其容易和普通方法混淆,所 ...

  3. iOS开发:不可变数组和可变数组的区别分析(NSArray / NSMutableArray)

    本篇博文分享一个理论知识点,Object-C中可变数组和不可变数组的对比使用,知识比较简单基础,大牛可以忽略.在iOS开发中,一般经常用NSArray类和NSMutableArray类来表示数组,其中 ...

  4. iOS中Runtime简析

    一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...

  5. 二维数组在c语言中的作用,C语言中的二维数组

    1.二维数组的定义和引用 一. 数据类型 数组名[常量表达式1][常量表达式2]; (1)假如有个二维数组array[n][m],则行下标的取值范围0~n-1 (2)列下标的取值范围0~m-1 (3) ...

  6. linux c99 可变长数组,C中不支持可变长度数组C99(Variable length arrays C99 not supported in C)...

    C中不支持可变长度数组C99(Variable length arrays C99 not supported in C) 在Visual Studio 2005中,我正在尝试编译.c文件: int ...

  7. 华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“

    我们的生活态度就应该是 "不抱怨" ! 其实我想写这篇文章很久了,因为自己做的iOS开发 ,对数据这一块有这极高的要求.所以一些必须的存储数据的使用,我们都有必要熟悉用法.在以前我 ...

  8. ios可变数组的操作

    #pragma mark 创建数组c NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@& ...

  9. c语言中函数(linux命令查看依赖类库),数组(内存存储是连续的内存空间),Linux下查看a,a[0],a之间的值,可变数组

    1.查看一个c函数依赖的类的方式: gcc t.c -o app 使用ldd app命令查看依赖的类,截图如下: 2.库函数包括: a.C标准库函数,(c89/c99标准定义的函数接口,由操作系统厂商 ...

最新文章

  1. 美妙的Python又来了
  2. 转:inux shell脚本的字符串截取
  3. Module System of Swift (简析 Swift 的模块系统)
  4. 安卓案例:利用内容提供者显示和添加联系人
  5. php -l 检查文件是否语法错误
  6. 关闭Windows Defender保护
  7. c语言编程n元一次方程,解n元一次方程
  8. 黑马程序员—黑客与画家——工作3年再转型(附赠大绝招)
  9. 强大web打印控件下载 - 2019年最新支持所有浏览器-楚琳打印
  10. mapstd matlab详解,Matlab自带的数据标准化方法(mapminmax和mapstd)详细解析
  11. C#文件操作——文件、数据流与注册表
  12. 两个生物特征识别会议的最新情况
  13. css好看的html径向渐变,CSS3径向渐变
  14. ROS2机器人-C++和Python怎么选
  15. 数学建模之层次分析法模型
  16. 【图像超分辨率重建】——EnhanceNet论文精读笔记
  17. Intellij Idea在引入Eclipse工程的时候,报unmapped spring configuration的解决办法
  18. ash、awr和addm详解
  19. 如何将CAD图纸由DWG格式转换成PDF格式?
  20. 收到字节跳动的面试邀请,我却掉了链子

热门文章

  1. WebKit 分析–for android【new】
  2. PHP--TP开发模式
  3. 数据库性能优化—主从分离
  4. Java集合—HashMap底层原理
  5. ElasticSearch,docker 安装ElasticSearch,Springboot 使用 ElasticSearch JavaAPI
  6. Android更新平台架构方案
  7. 集合框架之Map LinkedHashMap
  8. HURST 1116:选美大赛(LIS+路径输出)
  9. zeroclipboard浏览器复制插件使用记录
  10. win10搭建FTP服务器