2017-12-21 28 views
0

는 I 배열 구축 반환하는 방법이 :오브젝티브 C : @ []과의 차이는 무엇 [NSArray를 ALLOC] initWithCapacity : 0]

- (NSArray *)foo 
{ 
    NSUInteger capacity = [self getArrayCapacity]; 
    if (capacity == 0) { 
     return @[]; 
    } else { 
     NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:capacity]; 
     // add elements to the array, as many as capacity 
     ... 
     return array; 
    } 
} 

사용 메모리에 차이가 나 내가 코드를 단순화하면 성능은 다음과 같이

- (NSArray *)fooSimplified 
{ 
    NSUInteger capacity = [self getCapacity]; 
    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:capacity]; 
     // add elements to the array, as many as capacity 
     ... 
     return array; 
    } 
} 

그래서 때 대신 @[]를 반환 capacity == 0[[NSMutableArray alloc] initWithCapacity:0]

는 일입니다 반환 성능 또는 메모리 패널티/차이가 있습니까?

+0

를 테스트 할 수 있습니까? 당신은 100 만회의 루프에서 그것을 호출 할 수 있고 속도가 2 사이에 다른지 볼 수 있습니다. 당신은 악기를 사용하여 메모리 크기에 차이가 있는지 확인할 수 있습니다. 또한, 즉시 구문은 변경 가능하거나 변경 불가능한 인스턴스를 생성합니까? 워드 프로세서를 읽는 것은 불변의 생성만을 보여줍니다. – user1118321

+0

getter 접두사에'get'을 붙이지 마십시오 (objc는 일반적으로'get' 접두사를 사용하지 않습니다). – bbum

답변

1
[[NSMutableArray alloc] initWithCapacity:0] 

이렇게하면 가변 개수의 배열이 생성되고 지정된 수의 요소를 보유 할만큼 충분한 메모리가 할당되므로 구현에 따라 충분히 높은 수만큼 메모리를 할당합니다.

@[] 

는 동일한 인스턴스 당신이 그것을 만들 때마다입니다 __NSArray0 클래스의 인스턴스를 반환하도록 최적화되어 있으므로이 경우에는 여분의 메모리 할당은 없다.

따라서 @[]을 사용하는 것이 더 적합하지만이 함수를 매우 자주 호출하지 않는 한 실제 차이점은 나타나지 않을 것입니다.

의 iOS 시뮬레이터에서 몇 가지 벤치 마크를 실행 : 당신은 자신 있다는

NSLog(@"%llu", dispatch_benchmark(100, ^{ 
    for (int i = 0; i < 1000000; ++i) { 
     NSArray *a = @[]; 
    } 
    })); 

NSLog(@"%llu", dispatch_benchmark(100, ^{ 
    for (int i = 0; i < 1000000; ++i) { 
     NSArray *a = [[NSMutableArray alloc] initWithCapacity:0]; 
    } 
    })); 


Array Literal: 9835575 ns 
Mutable Array: 157169503 ns 
+3

사소한 점; 'initWithCapacity :'는 반드시 공간을 미리 할당하지는 않습니다. 메모리가 잠재적으로 최적으로 관리되어야하는 방식을 변경 가능한 배열에 알리는 것입니다. – bbum