설정 - objective-c 메모리 관리



사용자 지정 dealloc 및 ARC(Objective-C) (1)

ARC를 사용할 때는 [super dealloc] 명시 적으로 호출하지 않아야합니다 - 컴파일러가이를 처리합니다 ( Clang LLVM ARC 문서, 7.1.2 장 참조 ).

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

내 작은 iPad 애플 리케이션에서 나는 관찰자를 사용하는 "스위치 언어"기능이 있습니다. 모든 뷰 컨트롤러는 viewDidLoad: 동안 자신을 내 옵저버에 등록합니다.

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

사용자가 "언어 변경"버튼을 클릭하면 새 언어가 내 모델에 저장되고 관찰자에게 등록 된 객체에 대한 updateUi: 선택기가 호출됩니다.

이것은 TabBarController에 View 컨트롤러가있는 경우를 제외하고는 아주 잘 작동합니다. 이는 탭 막대가로드 될 때보 viewDidLoad: 초기화하지 않고 하위 제어기에서 탭 아이콘을 가져 오기 때문에 viewDidLoad: 가 호출되지 않기 때문에 해당보기 제어기는 언어 변경 통지를 수신하지 않기 때문입니다. 이 때문에 내 registerObject: 호출을 init 메소드로 옮겼습니다.

이전에 viewDidLoad: 사용했을 때 viewDidLoad: 내 관찰자에게 등록하려면 viewDidUnload: 를 사용하여 등록을 취소하십시오. 이제는 init 에 등록 dealloc 에서 등록을 취소하는 것이 좋습니다.

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

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

이 오류가 발생합니다.

ARC는 명시 적 메시지 전송을 'dealloc'

수퍼 클래스가 제대로 정리되도록 [super dealloc] 을 호출해야하지만 ARC는이를 금지합니다. 이제 막 달라 붙었습니다. 내 물건이 죽어 가고있을 때 정보를 얻는 또 다른 방법이 있습니까?





automatic-ref-counting