高效的把NSMutableArray变成NSArray
来源:互联网 发布:数据库中create table 编辑:程序博客网 时间:2024/06/06 16:34
高效的把NSMutableArray变成NSArray
我们在方法内部可能会用NSMutableArray,但是返回的时候希望其他人不去改我们的Array
NSMutableArray *array1 = [@[] mutableCopy]; for (int i = 0; i < 10000000; i++) { [array1 addObject:@(i)]; } return array1;
这个时候我们通常的做法是拷贝array1或者是生成一个新的array1
return [array1 copy];return [NSArray arrayWithArray:array1];
这里呢,我们打印了下时间
NSMutableArray *array1 = [@[] mutableCopy]; NSMutableArray *array2 = [@[] mutableCopy]; PERF_ENTER_(init) for (int i = 0; i < 10000000; i++) { [array1 addObject:@(i)]; [array2 addObject:@(i)]; } PERF_LEAVE_(init) PERF_ENTER_(copy) NSArray *array3 = [array1 copy]; PERF_LEAVE_(copy) NSLog(@"%@", [array3 class]); PERF_ENTER_(arrayWithArray) NSArray *array4 = [NSArray arrayWithArray:array1]; PERF_LEAVE_(arrayWithArray) NSLog(@"%@", [array4 class]);/* 2015-01-07 00:57:36.869 JoinShow[1134:68543] +[XYPerformance recordName:andTime:] 'init' = 5.492105(s)2015-01-07 00:57:37.125 JoinShow[1134:68543] +[XYPerformance recordName:andTime:] 'copy' = 0.255650(s)2015-01-07 00:57:37.125 JoinShow[1134:68543] __NSArrayI2015-01-07 00:57:37.373 JoinShow[1134:68543] +[XYPerformance recordName:andTime:] 'arrayWithArray' = 0.247696(s)2015-01-07 00:57:37.373 JoinShow[1134:68543] __NSArrayI*/
发现正常拷贝一个大array需要0.2s,这已经是不能忍的时间了.需要对方法进行优化.
问题的本质是什么,是我们需要返回一个不可变的array,因此我们可以直接把 NSMutableArray 对象的isa 修改成 NSArray.
- (NSArray *)immutable{ object_setClass(self, [NSArray class]); return self;} PERF_ENTER_(immutable) NSArray *array5 = [array2 immutable]; PERF_LEAVE_(immutable) NSLog(@"%@", [array5 class]);/*2015-01-07 00:57:37.373 JoinShow[1134:68543] +[XYPerformance recordName:andTime:] 'immutable' = 0.000030(s)2015-01-07 00:57:37.373 JoinShow[1134:68543] NSArray*/
看下时间,果然快很多.
-----------------
关于这这样做,咱只能说想法是好的.实际...
实际这么改会出bug的.
4 1
- 高效的把NSMutableArray变成NSArray
- NSArray,NSMutableArray的用法
- NSArray与NSMutableArray的区别
- NSArray与NSMutableArray的区别
- NSArray和NSMutableArray的用法
- NSArray和NSMutableArray的使用
- NSArray和NSMutableArray的用法
- NSArray和NSMutableArray的用法
- NSArray 和 NSMutableArray 的区别
- NSArray与NSMutableArray的区别
- NSArray和NSMutableArray的用法
- NSArray与NSMutableArray的区别
- NSArray和NSMutableArray的用法
- NSArray和NSMutableArray的用法
- NSArray和NSMutableArray的用法
- NSArray,NSMutableArray的KVO操作
- NSArray、NSMutableArray的copy、mutableCopy
- NSArray/NSMutableArray
- akoj-1244-括号的深度
- akoj-1232-找模式串
- MacBook Pro 安装myeclipse 关于虚拟内存的问题
- Linux守护进程
- Ajax动态刷新元素js事件失效
- 高效的把NSMutableArray变成NSArray
- [水题][第一阶段-回归水题][HDOJ-2029]Palindromes _easy version
- ExpandableListView / ExpandableListActivity 使用及数据更新
- [Cordova学习]4.Cordova(iOS)架构和实现
- 再看出参---分析GetMemory的错误
- 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)
- android 获取上一个activity返回值的方法
- 20150107 Eclipse安装了CDT后还是不能编写C和C++
- iOS TableView 使用(swift)