No meu pequeno aplicativo para iPad, tenho uma função "mudar idioma" que usa um observador. Todo controlador de exibição se registra no meu observador durante o processo viewDidLoad:
.
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
Quando o usuário pressiona o botão "alterar idioma", o novo idioma é armazenado no meu modelo e o observador é notificado e chama um updateUi:
seletor em seus objetos registrados.
Isso funciona muito bem, exceto quando tenho controladores de exibição em um TabBarController. Isso ocorre porque, quando a barra de guias é carregada, ela busca os ícones de guias de seus controladores filhos sem inicializar as visualizações, por isso viewDidLoad:
não é chamada, portanto esses controladores de exibição não recebem notificações de alteração de idioma. Por isso, mudei minhas registerObject:
chamadas para o init
método
Quando eu costumava viewDidLoad:
me registrar com meu observador, costumava viewDidUnload:
cancelar o registro. Como agora estou me registrando init
, faz muito sentido cancelar o registro dealloc
.
Mas aqui está meu problema. Quando escrevo:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
Eu recebo este erro:
O ARC proíbe o envio explícito de mensagens de 'dealloc'
Como preciso ligar [super dealloc]
para garantir que as superclasses limpem corretamente, mas o ARC proíbe isso, agora estou preso. Existe outra maneira de me informar quando meu objeto está morrendo?
Respostas:
Ao usar o ARC, você simplesmente não chama
[super dealloc]
explicitamente - o compilador lida com você (como descrito no documento Clang LLVM ARC, capítulo 7.1.2 ):fonte
dealloc
nunca é chamada. Faz sentido chamar[observer unregisterObject:self]
desalocação? o que estou perdendo?