Dans ma petite application iPad, j'ai une fonction de "changement de langue" qui utilise un observateur. Chaque contrôleur de vue s'enregistre auprès de mon observateur pendant son viewDidLoad:
.
- (void)viewDidLoad
{
[super viewDidLoad];
[observer registerObject:self];
}
Lorsque l'utilisateur appuie sur le bouton "changer de langue", la nouvelle langue est stockée dans mon modèle et l'observateur est averti et appelle un updateUi:
sélecteur sur ses objets enregistrés.
Cela fonctionne très bien, sauf lorsque j'ai des contrôleurs de vue dans un TabBarController. En effet, lorsque la barre d'onglets se charge, elle récupère les icônes d'onglet de ses contrôleurs enfants sans initialiser les vues, elle viewDidLoad:
n'est donc pas appelée, de sorte que ces contrôleurs de vue ne reçoivent pas de notifications de changement de langue. Pour cette raison, j'ai déplacé mes registerObject:
appels dans la init
méthode.
À l'époque où je viewDidLoad:
m'inscrivais auprès de mon observateur, je me viewDidUnload:
désinscrivais. Comme je m'inscris maintenant init
, il est très logique de se désinscrire dealloc
.
Mais voici mon problème. Quand j'écris:
- (void) dealloc
{
[observer unregisterObject:self];
[super dealloc];
}
Je reçois cette erreur:
L'ARC interdit l'envoi de message explicite de 'dealloc'
Puisque je dois appeler [super dealloc]
pour m'assurer que les superclasses se nettoient correctement, mais ARC l'interdit, je suis maintenant bloqué. Existe-t-il un autre moyen de s'informer lorsque mon objet est en train de mourir?
Réponses:
Lorsque vous utilisez ARC, vous n'appelez simplement pas
[super dealloc]
explicitement - le compilateur le gère pour vous (comme décrit dans le document Clang LLVM ARC, chapitre 7.1.2 ):la source
dealloc
n'est jamais appelé. Est-il judicieux d'appeler[observer unregisterObject:self]
en dealloc? Qu'est-ce que je rate?