IOS 中runtime 不可变数组__NSArray0 和__NSArrayI
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相关推荐
- ios 替换数组中元素_ios可变数组的所有操作
#pragma mark 创建数组c NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@& ...
- iOS 多线程安全 与可变数组
完全来自于 iOS 多线程安全与可变字典 的学习 基本相同,举一反三 直接上样例代码 是我参照网上,根据当前业务需求改的. 其实好多人在这里喜欢用类别处理.我个人觉得用类别 极其容易和普通方法混淆,所 ...
- iOS开发:不可变数组和可变数组的区别分析(NSArray / NSMutableArray)
本篇博文分享一个理论知识点,Object-C中可变数组和不可变数组的对比使用,知识比较简单基础,大牛可以忽略.在iOS开发中,一般经常用NSArray类和NSMutableArray类来表示数组,其中 ...
- iOS中Runtime简析
一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C语言,函数的调用在编译的时候会决定调用哪个函数. 对于OC的函数,属于 ...
- 二维数组在c语言中的作用,C语言中的二维数组
1.二维数组的定义和引用 一. 数据类型 数组名[常量表达式1][常量表达式2]; (1)假如有个二维数组array[n][m],则行下标的取值范围0~n-1 (2)列下标的取值范围0~m-1 (3) ...
- 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 ...
- 华山论剑之iOS中(数组,字典,SQLite,CoreData)的“增删改查“
我们的生活态度就应该是 "不抱怨" ! 其实我想写这篇文章很久了,因为自己做的iOS开发 ,对数据这一块有这极高的要求.所以一些必须的存储数据的使用,我们都有必要熟悉用法.在以前我 ...
- ios可变数组的操作
#pragma mark 创建数组c NSMutableArray * array =[[NSMutableArray alloc] initWithObjects:@"a",@& ...
- c语言中函数(linux命令查看依赖类库),数组(内存存储是连续的内存空间),Linux下查看a,a[0],a之间的值,可变数组
1.查看一个c函数依赖的类的方式: gcc t.c -o app 使用ldd app命令查看依赖的类,截图如下: 2.库函数包括: a.C标准库函数,(c89/c99标准定义的函数接口,由操作系统厂商 ...
最新文章
- 美妙的Python又来了
- 转:inux shell脚本的字符串截取
- Module System of Swift (简析 Swift 的模块系统)
- 安卓案例:利用内容提供者显示和添加联系人
- php -l 检查文件是否语法错误
- 关闭Windows Defender保护
- c语言编程n元一次方程,解n元一次方程
- 黑马程序员—黑客与画家——工作3年再转型(附赠大绝招)
- 强大web打印控件下载 - 2019年最新支持所有浏览器-楚琳打印
- mapstd matlab详解,Matlab自带的数据标准化方法(mapminmax和mapstd)详细解析
- C#文件操作——文件、数据流与注册表
- 两个生物特征识别会议的最新情况
- css好看的html径向渐变,CSS3径向渐变
- ROS2机器人-C++和Python怎么选
- 数学建模之层次分析法模型
- 【图像超分辨率重建】——EnhanceNet论文精读笔记
- Intellij Idea在引入Eclipse工程的时候,报unmapped spring configuration的解决办法
- ash、awr和addm详解
- 如何将CAD图纸由DWG格式转换成PDF格式?
- 收到字节跳动的面试邀请,我却掉了链子