2012-12-12 2 views
4

개체에 NSMutableArray을 사용할 수 있지만 옵션이 아니며 NSArray에 새 요소를 추가해야하는 경우 어떻게 될까요? 이 일을 어떻게 처리할까요?NSArray에 요소 추가

내 즉각적인 대답은 원래 NSArrayNSMutableArray를 만들 여기에 새로운 요소를 추가, 다음 원래 NSArray로 다시 NSMutableArray 캐스팅하는 것입니다.

저는 인터뷰에서이 질문을 받았으며 처음에는 NSMutableArray을 사용하는 것 외에 올바른 해결책이 무엇인지 궁금합니다.

답변

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

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

또는

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

array = [array arrayByAddingObjectsFromArray:newArray]; 
+0

** 매우 큰 배열이 있다고 가정 해 보겠습니다. OP가 요구하는 것을 수행하는 가장 효율적인 방법은 무엇입니까? 귀하의 솔루션, 또는 OP가 제안한 mutableCopy-> add-> cast 솔루션입니까? – Rob

+0

가장 효율적입니다. 가변 배열. 그런 다음 내 메서드에 추가하여 배열. 나는 몰라. 테스트 해보고 결과를 알려주십시오 :-) – Fogmeister

+0

나는 이것을 테스트했는데 크기에 관계없이 요소를 하나만 추가하는 한 동일한 것으로 판명되었습니다. 여기에 긴 설명이 있습니다 : http://stackoverflow.com/a/26517217/1564332 – Rob

3

NSArray 개체에 mutableCopy을 사용하면 이전 개체가 포함 된 NSMutableArray을 반환 할 수 있습니다.

3

NSArray 개체 때문에 수정 될 수없는 불변이다. 유일한 옵션은 중간 객체를 통해 새 NSArray을 만들고이 새 배열을 소유 객체에 다시 넣는 것입니다 (허용되는 경우 허용).

0

이것은 단순히 트릭 질문입니다. NSArrays은 변경 불가능하며 이전 배열의 새로운 NSArray 또는 NSMutableArray을 생성하지 않고는 변경할 수 없습니다. 간단하고 간단합니다.

0

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의 크기. 나는 크기에 관계없이 시간이 매우 비슷하다는 것을 알게되었습니다. 길이에 관계없이 때로는 한 가지 방법이 더 빠르며, 다른 하나는 더 빠릅니다. 나는 내부적으로 그들이 똑같은 일을한다고 생각합니다.

여기에 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,000 개 크기의 배열에 500 개의 요소를 추가하는 것이 두 번째 방법을 사용하는 것이 더 빠를 것 같지만 다른 실험에 남겨 두었습니다.