208 votes

Dealloc personnalisé et ARC (Objective-C)

Dans mon petit iPad app j'ai un "changement de langue" fonction qui utilise un observateur. Chaque vue-contrôleur enregistre avec mon observateur, lors de son viewDidLoad:.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [observer registerObject:self];
}

Lorsque l'utilisateur appuie sur le "changement de langue", le nouveau langage est stocké dans mon modèle et l'observateur avisé et appelle une updateUi: sélecteur sur ses objets inscrits.

Cela fonctionne très bien, sauf quand j'ai vue les contrôleurs dans un TabBarController. C'est parce que lorsque l'onglet de la barre de charge, il récupère l'onglet icônes de son enfant contrôleurs sans l'initialisation de la vue, de sorte viewDidLoad: n'est pas appelé, de sorte que ceux de la vue des contrôleurs ne recevez pas de changement de la langue des notifications. De ce fait, j'ai déplacé mon registerObject: des appels dans l' init méthode.

Lorsque j'utilisais viewDidLoad: inscrire à mon observateur, j'ai utilisé viewDidUnload: désinscrire. Depuis que je suis maintenant en vous inscrivant dans init, il fait beaucoup de sens pour vous désinscrire en dealloc.

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

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

J'obtiens cette erreur:

ARC interdit explicite d'envoi de messages de "dealloc'

Depuis que j'ai besoin d'appeler [super dealloc] afin d'assurer des super-classes nettoyer correctement, mais l'ARC interdit, je suis maintenant bloqué. Est-il une autre façon d'être informé quand mon objet est en train de mourir?

416voto

justin Points 72871

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 ARC Clang LLVM, chapitre 7.1.2 ):

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X