web-dev-qa-db-fra.com

Dealloc personnalisé et ARC (Objective-C)

Dans ma petite application iPad, j'ai une fonction "changer 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 en 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'onglets de ses contrôleurs enfants sans initialiser les vues, donc viewDidLoad: n'est pas appelé, donc ces contrôleurs de vue ne reçoivent pas de notifications de changement de langue. À cause de cela, j'ai déplacé mon registerObject: appelle la méthode init.

Retour quand j'ai utilisé viewDidLoad: pour m'inscrire auprès de mon observateur, j'ai utilisé viewDidUnload: se désinscrire. Étant donné que je m'inscris maintenant dans init, il est judicieux de se désinscrire de dealloc.

Mais voici mon problème. Quand j'écris:

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

Je reçois cette erreur:

ARC interdit l'envoi de message explicite de 'dealloc'

Depuis que j'ai besoin d'appeler [super dealloc] _ pour que les super-classes soient bien nettoyées, 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?

204
Niku

Lorsque vous utilisez ARC, vous n’appelez tout 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 ):

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