작은 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)
}