2014-02-27 2 views

답변

4

그들은 비슷한 일을하지만 꽤 똑같은 것은 아닙니다.

[NSArray array]은 자동 반복 배열을 만듭니다. [[NSArray alloc] init]은 보유 개수가 1 인 배열을 작성하여 emptyArray를 소유자로 만듭니다.

ARC를 사용하면 많은 차이를 느끼지 않지만 수동 메모리 관리가 가능합니다. ARC를 사용하고 있다면 아마 둘 중 하나를 안전하게 사용할 수 있지만, 하나의 형식을 고수 할 것을 권한다. (개인적으로 alloc/init을 선호한다.) 여기

애플 코코아 밀접 다음 GNUstep에서 NSArray.m 발췌 (이전 넥스트 OpenStep)

/** 
* Returns an empty autoreleased array. 
*/ 
+ (id) array 
{ 
    id o; 

    o = [self allocWithZone: NSDefaultMallocZone()]; 
    o = [o initWithObjects: (id*)0 count: 0]; 
    return AUTORELEASE(o); 
} 
+0

autoreleased 오브젝트가 가장 가까운 풀을 비울 때까지 풀에서 수집 할 때 메모리 사용량이 늘어날 수 있습니다.자동 복구 풀을 작성하지 않으면 실행 루프의 현재 반복이 끝날 때까지 해제되지 않습니다. – Atlas

0

차이가 메모리 관리 방식이다

NSArray *emptyArray = [NSArray array]; 

이때 emptyArray자동 완성 된 배열 객체를 가리키고 있습니다. 즉, 객체를 소유하지 않은 것입니다. 또한 ARC를 사용하지 않으면 현재 실행 루프 이후에이 객체를 사용할 수 없다는 것을 의미합니다. 즉, 유지 카운트를 증가시키지 않으면 파괴 될 수 있기 때문에이 객체를 사용할 수 없습니다. 당신이 배열을 얻을이 경우

NSArray *emptyArray = [[NSArray alloc] init]; 

카운트를 하나의
을 유지합니다. 즉, 메모리 사용을 마친 후에는 메모리 할당을 해제해야합니다.

ARC를 사용하지 않는 경우이 차이는 특별히 중요입니다.

0
NSArray *emptyArray = [NSArray array]; 

NSArray *emptyArray = [[[NSArray alloc] init] autorelease]; 

이 의미 [NSArray array] 반환 자동 해제 객체와 유사하다. 따라서 [NSArray array]을 사용하여 생성 된 객체를 해제 할 필요가 없습니다.

그러나 [[NSArray alloc] init]을 사용하여 생성 된 개체를 릴리스해야합니다.

0

기본적으로 클래스 메소드에서 반환 된 새 인스턴스는 자동으로 릴리즈 된 인스턴스를 반환합니다. 이는 실제로 IOS가 소유권을 보유하고 있으므로 릴리스 걱정을 할 필요가 없음을 의미합니다. 당신은 MRC를 사용하는 경우 [[NSArray alloc] init]를 사용하는 경우

NSArray *arr=[NSArray array];는 당신이 ARC에 당신을 위해 자동으로 알아서하는 동안 해제 할 책임이있다 NSArray *emptyArray=[[[NSArray alloc] init] autorelease];

과 동일합니다.

따라서 ARC 또는 MRC와 관계없이 항상 [NSArray array]을 사용하는 것이 좋습니다.

관련 문제