我知道我们可以只使用 aNSMutableArray
作为对象,但是如果这不是一个选项并且我们需要向 a 添加新元素怎么办NSArray
。我们将如何做这件事?
我的直接答案是NSMutableArray
用原始创建一个,向其中NSArray
添加新元素,然后将其NSMutableArray
转换回原始NSArray
。
我在一次采访中被问到这个问题,我很好奇正确的解决方案可能是什么,除了NSMutableArray
首先使用 a 。
我知道我们可以只使用 aNSMutableArray
作为对象,但是如果这不是一个选项并且我们需要向 a 添加新元素怎么办NSArray
。我们将如何做这件事?
我的直接答案是NSMutableArray
用原始创建一个,向其中NSArray
添加新元素,然后将其NSMutableArray
转换回原始NSArray
。
我在一次采访中被问到这个问题,我很好奇正确的解决方案可能是什么,除了NSMutableArray
首先使用 a 。
NSArray *array = [NSArray arrayWithObjects:@"One", @"Two", nil];
array = [array arrayByAddingObject:@"Three"];
或者
NSArray *newArray = [NSArray arrayWithObjects:@"Three", @"Four", nil];
array = [array arrayByAddingObjectsFromArray:newArray];
您可以mutableCopy
在NSArray
对象上使用来返回NSMutableArray
包含先前对象的一个。
NSArray
对象是不可变的,因此它们不能被修改。唯一的选择是创建一个新的NSArray
(也许通过一个中间NSMutableArray
对象)并将这个新数组放回拥有的对象(如果它允许的话)。
arrayByAddingObject
我想知道使用和创建可变副本然后添加一个元素之间的性能差异是什么。
我发现没关系。
这是我用的
- (IBAction)doTest
{
for(int n = 0; n < 7; n++){
[self runTestWithExponent:n];
}
NSLog(@"done");
}
- (void)runTestWithExponent:(double)exponent
{
int arraySize = pow(10.0, exponent);
NSMutableArray *originalMutableArray = [NSMutableArray arrayWithCapacity:arraySize];
for(int i = 0; i < arraySize; i++){
[originalMutableArray addObject:@(i)];
}
NSArray *originalArray = [NSArray arrayWithArray:originalMutableArray];
originalMutableArray = nil;
//test first time
NSDate *now = [NSDate date];
NSArray *newArray = [originalArray arrayByAddingObject:@(-1)];
NSTimeInterval time1 = [[NSDate date] timeIntervalSinceDate:now];
newArray = nil;
//test second time
now = [NSDate date];
NSMutableArray *mutable = [originalArray mutableCopy];
[mutable addObject:@(-1)];
NSTimeInterval time2 = [[NSDate date] timeIntervalSinceDate:now];
mutable = nil;
NSString *winner = (time1 == time2) ? @"same" : ((time1 < time2) ? @"arrayByAdding" : @"mutable");
NSLog(@"%i : %f --- %f : %@ %f%%", arraySize, time1, time2, winner, (time1/time2 * 100));
}
如您所见,我测试了不同的数组大小。尺寸为 1、10、100 ... 1,000,000。我发现无论大小,时代都非常相似。对于任何给定的长度,有时一种方法更快,而另一种方法则更快。我猜他们在内部做同样的事情。
这是三个运行的输出:
1 : 0.000026 --- 0.000034 : arrayByAdding 76.491228%
10 : 0.000011 --- 0.000011 : same 100.000000%
100 : 0.000021 --- 0.000024 : arrayByAdding 87.344913%
1000 : 0.000228 --- 0.000260 : arrayByAdding 87.689133%
10000 : 0.001458 --- 0.001406 : mutable 103.696638%
100000 : 0.015396 --- 0.015625 : arrayByAdding 98.534393%
1000000 : 0.158018 --- 0.162849 : arrayByAdding 97.033438%
done
1 : 0.000011 --- 0.000012 : arrayByAdding 92.039801%
10 : 0.000012 --- 0.000014 : arrayByAdding 85.531915%
100 : 0.000020 --- 0.000025 : arrayByAdding 79.952267%
1000 : 0.000185 --- 0.000144 : mutable 128.435430%
10000 : 0.001397 --- 0.001437 : arrayByAdding 97.216807%
100000 : 0.014448 --- 0.014132 : mutable 102.235803%
1000000 : 0.145622 --- 0.149862 : arrayByAdding 97.170746%
done
1 : 0.000013 --- 0.000012 : mutable 107.920792%
10 : 0.000011 --- 0.000013 : arrayByAdding 84.862385%
100 : 0.000025 --- 0.000029 : arrayByAdding 86.036961%
1000 : 0.000165 --- 0.000135 : mutable 122.207506%
10000 : 0.001547 --- 0.001470 : mutable 105.242884%
100000 : 0.014817 --- 0.014337 : mutable 103.347954%
1000000 : 0.146554 --- 0.148468 : arrayByAdding 98.710857%
done
请记住,这仅针对添加一个元素进行了测试。我怀疑(例如)使用第二种方法将 500 个元素添加到 1,000 大小的数组中可能会更快,但我将此类实验留给其他人。
这只是一个技巧问题。是不可变的,如果不创建新数组或从以前的数组NSArrays
创建,就无法更改,简单明了。NSArray
NSMutableArray