[objective-c] 사용자 지정 할당 해제 및 ARC (Objective-C)

작은 iPad 앱에는 관찰자를 사용하는 “스위치 언어”기능이 있습니다. 모든보기 컨트롤러는 내 관찰자에게 자신을 등록합니다 viewDidLoad:.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [observer registerObject:self];
}

사용자가 “언어 변경”버튼을 누르면 새 언어가 내 모델에 저장되고 관찰자에게 통지되고 updateUi:등록 된 객체 에서 선택기를 호출 합니다.

이것은 TabBarController에 뷰 컨트롤러가있는 경우를 제외하고는 매우 잘 작동합니다. 이는 탭 막대가로드 될 때 뷰를 초기화하지 않고 자식 컨트롤러에서 탭 아이콘을 가져 오기 때문에 viewDidLoad:호출되지 않으므로 뷰 컨트롤러가 언어 변경 알림을받지 않기 때문입니다. 이로 인해 registerObject:호출을 init메서드 로 옮겼습니다 .

viewDidLoad:관찰자로 등록 할 때 다시 등록 viewDidUnload:을 취소했습니다. 내가 지금 등록하고 있기 때문에 init에 등록을 취소하는 것이 좋습니다 dealloc.

그러나 여기 내 문제가 있습니다. 내가 쓸 때 :

- (void) dealloc
{
    [observer unregisterObject:self];
    [super dealloc];
}

이 오류가 발생합니다.

ARC는 ‘dealloc’의 명시적인 메시지 전송을 금지합니다.

[super dealloc]수퍼 클래스가 올바르게 정리되도록 호출해야 하지만 ARC는이를 금지하므로 이제 막혔습니다. 물건이 죽을 때 알림을받는 다른 방법이 있습니까?



답변

ARC를 사용할 때는 [super dealloc]명시 적으로 호출하지 않아도 됩니다 ( Clang LLVM ARC 문서, 7.1.2 장에 설명 된대로 컴파일러가이를 대신하여 처리합니다 ).

- (void) dealloc
{
    [observer unregisterObject:self];
    // [super dealloc]; //(provided by the compiler)
}


답변