Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 向NSArray添加元素_Ios_Objective C_Nsmutablearray - Fatal编程技术网

Ios 向NSArray添加元素

Ios 向NSArray添加元素,ios,objective-c,nsmutablearray,Ios,Objective C,Nsmutablearray,我知道我们可以对对象使用NSMutableArray,但是如果这不是一个选项,我们需要向NSArray中添加新元素呢。我们该怎么做呢 我的直接答案是使用原始的NSArray创建一个NSMutableArray,向其中添加新元素,然后将NSMutableArray强制转换回原始的NSArray 我在一次采访中被问到这一点,我很好奇除了首先使用NSMutableArray之外,还有什么正确的解决方案。您可以在NSArray对象上使用mutableCopy来返回包含以前对象的NSMutableArra

我知道我们可以对对象使用
NSMutableArray
,但是如果这不是一个选项,我们需要向
NSArray
中添加新元素呢。我们该怎么做呢

我的直接答案是使用原始的
NSArray
创建一个
NSMutableArray
,向其中添加新元素,然后将
NSMutableArray
强制转换回原始的
NSArray


我在一次采访中被问到这一点,我很好奇除了首先使用
NSMutableArray
之外,还有什么正确的解决方案。

您可以在
NSArray
对象上使用
mutableCopy
来返回包含以前对象的
NSMutableArray

NSArray *array = [NSArray arrayWithObjects:@"One", @"Two", nil];

array = [array arrayByAddingObject:@"Three"];


NSArray
对象是不可变的,因此无法修改。唯一的选择是创建一个新的
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));
}

请记住,这只是在添加一个元素时测试的。我怀疑(例如)使用第二种方法向1000个大小的数组中添加500个元素可能会更快,但我将此类实验留给其他人。

假设我有一个非常大的数组。按照OP的要求,最有效的方法是什么?您的解决方案,或者OP?提出的mutableCopy->add->cast解决方案最有效。可变数组。然后在我的方法中添加数组。我不知道。测试它,让我知道你的发现:-)我测试了这个,结果是一样的,只要你只添加了一个元素,不管大小。下面是详细的解释:
- (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 : 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