標籤:nsmutablearray nsarray object objective-c
高效的把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*/
看下時間,果然快很多.
高效的把NSMutableArray變成NSArray