4

オブジェクトにaを使用できることはわかってNSMutableArrayいますが、それがオプションではなく、に新しい要素を追加する必要がある場合はどうでしょうかNSArray。これをどのように行うのでしょうか?

私の当面の答えはNSMutableArray、オリジナルでを作成しNSArray、それに新しい要素を追加しNSMutableArrayてから、オリジナルにキャストバックすることNSArrayです。

NSMutableArray私はインタビューでこれを尋ねられましたが、そもそもaを使用するだけでなく、正しい解決策が何であるかを知りたいと思っています。

4

5 に答える 5

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

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

また

NSArray *newArray = [NSArray arrayWithObjects:@"Three", @"Four", nil];

array = [array arrayByAddingObjectsFromArray:newArray];
于 2012-12-12T15:28:22.150 に答える
3

オブジェクトで使用mutableCopyして、前のオブジェクトを含むNSArrayを返すことができNSMutableArrayます。

于 2012-12-12T15:27:55.500 に答える
3

NSArrayオブジェクトは不変であるため、変更できません。唯一のオプションは、NSArray(おそらく中間NSMutableArrayオブジェクトを介して)新しい配列を作成し、この新しい配列を所有するオブジェクトに戻すことです(許可されている場合)。

于 2012-12-12T15:28:30.360 に答える
1

可変コピーを使用して作成し、 1つの要素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つの方法が高速である場合と、他の方法が高速である場合があります。内部的には同じことをしていると思います。

3つの実行の出力は次のとおりです。

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

これは、1つの要素を追加するためにのみテストされたことを覚えておいてください。たとえば、1,000サイズの配列に500個の要素を追加すると、2番目の方法を使用した方がおそらく高速になると思いますが、そのような実験は他の人に任せています。

于 2014-10-22T21:13:31.143 に答える
0

これは単なるトリックの質問です。は不変であり、新しい配列または以前の配列NSArraysを作成せずに変更することはできません。単純で単純です。NSArrayNSMutableArray

于 2012-12-12T16:29:56.897 に答える