2009-03-30 2 views
0

은 가정하자 내가 가진 같은 클래스 : copyWithZone의 정의에서copyWithZone :에서 모든 allocs 또는 반환 된 객체에 대해 zone을 사용해야합니까?

@interface SomeClass : NSObject<NSCopying> { 
    SomeOtherClass *obj; 
} 

:, 내가 이렇게 :

SomeClass *someCopy = [[SomeClass allocWithZone:zone] init]; 

그래서 내 질문입니다, 내가 OBJ의 복사본을 만들려면, 이 중 어느 것이 정확하고/권장 되는가?

옵션 A :

objCopy = [obj copyWithZone:zone]; 

옵션 B :

objCopy = [obj copy]; 
+0

또는 옵션 C : objCopy = [obj copyWithZone : [self zone]]; 복사본이 호출자와 동일한 영역에 할당됩니다. 하지만 처음부터 영역을 사용한다면 다시 그렇습니다. – adib

답변

3

당신이 [obj copyWithZone:zone]를 사용한다 참조 카운트 메모리 관리 (안 가비지 컬렉션)를 사용하는 경우. 또한 동일한 상황에서 +alloc 대신 +allocWithZone:을 사용하여 복사본을 할당해야합니다. 지정된 메모리 영역 (NSZone 참조)에있는 인스턴스에 메모리를 할당합니다. 개발자는 많은 개체를 대략적으로 더 이상 필요하지 않게 할당하려는 경우 별도의 영역을 사용할 수 있습니다. 그런 다음 전체 구역을 NSRecylceZone으로 한 번에 회수하여 메모리 조각화를 방지 할 수 있습니다. 일반적으로 개인 영역을 사용하는 것은 필요하지 않습니다 (일반적으로 성능에 해를 끼치고 코드를 프로파일 링하십시오!). 개발자가 특정 영역에서 복사본을 원한다고 가정하면 동일한 영역에 모든 관련 인스턴스를 원한다고 가정 할 것입니다.

-copy+alloc 메서드는 각각 -copyWithZone:+allocWithZone: 메서드를 호출하여 기본 영역을 전달합니다.

+0

특별한 이유가 있습니까 - 후드 내부에서 어떤 일이 발생합니까? –

+0

영역은 메모리를 할당하는 영역입니다. 그 아이디어는 하나의 영역에서 많은 양의 관련 할당 (코코아 객체, 버퍼 등)을 한 다음 그 안에있는 모든 객체 대신 영역을 해제 할 수 있다는 것입니다. 실제로, 나는 이것이 당신에게 많은 것을 얻지 않는다고 들었습니다. –

관련 문제