NSArray *emptyArray = [NSArray array];
NSArray *emptyArray = [[NSArray alloc] init];
둘 다 빈 배열을 만드는 것처럼 보입니다. 차이점은 무엇입니까?두 줄의 Objective-C 코드의 차이점은 무엇입니까?
NSArray *emptyArray = [NSArray array];
NSArray *emptyArray = [[NSArray alloc] init];
둘 다 빈 배열을 만드는 것처럼 보입니다. 차이점은 무엇입니까?두 줄의 Objective-C 코드의 차이점은 무엇입니까?
그들은 비슷한 일을하지만 꽤 똑같은 것은 아닙니다.
[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);
}
차이가 메모리 관리 방식이다
NSArray *emptyArray = [NSArray array];
이때 emptyArray
은 자동 완성 된 배열 객체를 가리키고 있습니다. 즉, 객체를 소유하지 않은 것입니다. 또한 ARC를 사용하지 않으면 현재 실행 루프 이후에이 객체를 사용할 수 없다는 것을 의미합니다. 즉, 유지 카운트를 증가시키지 않으면 파괴 될 수 있기 때문에이 객체를 사용할 수 없습니다. 당신이 배열을 얻을이 경우
NSArray *emptyArray = [[NSArray alloc] init];
카운트를 하나의을 유지합니다. 즉, 메모리 사용을 마친 후에는 메모리 할당을 해제해야합니다.
ARC를 사용하지 않는 경우이 차이는 특별히 중요입니다.
NSArray *emptyArray = [NSArray array];
는
NSArray *emptyArray = [[[NSArray alloc] init] autorelease];
이 의미 [NSArray array]
반환 자동 해제 객체와 유사하다. 따라서 [NSArray array]
을 사용하여 생성 된 객체를 해제 할 필요가 없습니다.
그러나 [[NSArray alloc] init]
을 사용하여 생성 된 개체를 릴리스해야합니다.
기본적으로 클래스 메소드에서 반환 된 새 인스턴스는 자동으로 릴리즈 된 인스턴스를 반환합니다. 이는 실제로 IOS가 소유권을 보유하고 있으므로 릴리스 걱정을 할 필요가 없음을 의미합니다. 당신은 MRC를 사용하는 경우 [[NSArray alloc] init]
를 사용하는 경우
NSArray *arr=[NSArray array];
는 당신이 ARC에 당신을 위해 자동으로 알아서하는 동안 해제 할 책임이있다 NSArray *emptyArray=[[[NSArray alloc] init] autorelease];
과 동일합니다.
따라서 ARC 또는 MRC와 관계없이 항상 [NSArray array]
을 사용하는 것이 좋습니다.
autoreleased 오브젝트가 가장 가까운 풀을 비울 때까지 풀에서 수집 할 때 메모리 사용량이 늘어날 수 있습니다.자동 복구 풀을 작성하지 않으면 실행 루프의 현재 반복이 끝날 때까지 해제되지 않습니다. – Atlas