2010-06-28 4 views
13

정직한 C++ 객체 포인터가 포함 된 objective-C++ 클래스가 있습니다.Objective-C++의 소멸자

Obj-C++ 클래스가 소멸되면 즉시 dealloc가 호출됩니까? 그렇다면, dealloc 메서드에서

delete obj 

을 넣어서 C++ 클래스를 파괴하는 가장 좋은 방법은 무엇입니까?

답변

23

"Obj-C++ class"라고 할 때 Objective-C 클래스가 일부 C++ 클래스를 포함한다고 생각합니다.

Objective-C 클래스는 파괴 될 때 dealloc을 호출하지 않습니다. 그들은 dealloc 메시지를 보내서 파괴됩니다. 당신은을 사용하여 제공

-(void)dealloc { 
    delete obj; 
    [super dealloc]; 
} 
+3

ARC는 dealloc 메시지를 보내는 것을 금지합니다. ARC를 대답 할 때 [[super dealloc]]을 호출 할 필요가 없습니다 [here] (http://stackoverflow.com/questions/7292119/custom-dealloc-using-arc-objective -c) – benjineer

+0

@benjineer이 답변이 작성되었을 때 ARC는 아직 공개되지 않았지만'[super dealloc]'이 ARC와 호환되지 않는다는 것이 맞습니다. –

7

프랭크 Shearar의 정답에 대한 보충 : 당신의 초기화 방법은 다음 OBJ를 인스턴스화 경우 탈출구 학자 인의 비트와

, 예,의 dealloc에서 delete obj 전화 OSX 10.4 또는 그 이후 버전의 SDK (그리고 아마 당신은 아이폰 런타임에 대해서는 잘 모르겠지만) 포인터를 사용하지 않고 Objective-C 클래스의 C++ 멤버를 포함시킬 수도 있습니다. 이전 버전의 OSX SDK의 문제는 C++ 멤버의 생성자와 소멸자가 호출되지 않는다는 것입니다. 그러나 컴파일러 옵션을 지정하면 (XCode에서는 설정이 GCC_OBJC_CALL_CXX_CDTORS으로 표시됨) ctor 및 dtor가 호출됩니다. 해당 페이지의 아래쪽 비트 인 Apple docs도 참조하십시오.

+0

포인터를 감싸는 동안 포인터를 저장해야하는 경우에도 작동합니다. 예 : 'std :: unique_ptr'에서 – Sebastian