내 작은 iPad 앱에는 관찰자를 사용하는 "언어 전환"기능이 있습니다. 모든 뷰 컨트롤러는 viewDidLoad:
동안 내 옵저버에 등록됩니다. 맞춤형 dealloc 및 ARC (Objective-C)
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
사용자가 "언어 변경"버튼을 명중
, 새로운 언어는 내 모델에 저장되고 관찰자는 통지 및 등록 된 객체에updateUi:
선택기를 호출합니다.
TabBarController에보기 컨트롤러가있는 경우를 제외하고는 매우 잘 작동합니다. 이는 탭 막대가로드 될 때 뷰를 초기화하지 않고 하위 컨트롤러에서 탭 아이콘을 가져 오므로 viewDidLoad:
이 호출되지 않기 때문에 해당보기 컨트롤러는 언어 변경 알림을받지 못하기 때문입니다. 이 때문에 내 registerObject:
전화를 init
방법으로 이동했습니다.
뒤로 viewDidLoad:
을 사용하여 옵저버에 등록 할 때 viewDidUnload:
을 사용하여 등록을 취소합니다. 현재 init
에 등록 중이므로 dealloc
에서 등록 취소하는 것이 좋습니다.
하지만 여기 내 문제가 있습니다. 내가 쓸 때 :
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
을이 오류를 얻을 :
ARC forbids explicit message send of 'dealloc'
내가 슈퍼 클래스가 제대로 정리하기 위해 [super dealloc]
를 호출 할 필요가 있지만, ARC 내가 지금 붙어있어 것을 금지입니다. 내 물건이 죽어 가고있을 때 정보를 얻는 또 다른 방법이 있습니까? 합니다 (Clang LLVM ARC document, chapter 7.1.2에 설명 된대로) 컴파일러는 당신을 위해 그것을 처리 -
-이 같은 상황은 메모리 누수가 발생할 수 있습니다, 누수 도구에는 표시되지 않습니다. dataModel이 옵저버에 대한 참조를 유지하는 경우 (이는 ivars의 경우에도 ARC 아래의 기본 항목 임), 보유 수는 0보다 커지기 때문에 dealloc은 호출되지 않습니다. 따라서 dealloc을 처음 호출 할 수있게하려면 관찰자를 수동으로 등록 취소해야 할 수 있습니다. –
나는 오른손과 왼손잡이 옵션으로 비슷한 것을 구현했다. 메시지가 필요한 VC는 현재 표시된 VC뿐입니다. 다른 사람들은 viewDidLoad 또는 viewDidAppear에서 모델을보고 인터페이스를 변경합니다. 어쩌면 이런 것이 더 효과적 일 것입니다. –
@BlazejCzapp 그가 UITabBarController를 사용하고 있기 때문에 UITabBarController가 등록 된 컨트롤러에 대한 참조를 항상 보유한다고 가정 해 봅시다. (메모리 컨트롤러의 '자식'컨트롤러가있는 경우입니다.) 메모리 누수가 여전히 문제가됩니까? 등록 된 컨트롤러가 언제 할당되는지는 알 수 없습니다. Thanks – Objectif