2010-11-04 10 views
1

Je suis tombé sur un vrai disque ici.Référence ne retournant pas nul même si désalloué

Ma classe est auto-créée (+ (void) start; -method) à laquelle un délégué est envoyé. Je dois envoyer quelques messages au délégué via les sélecteurs de délégués. Pour vérifier si le délégué a été libéré, j'ai essayé if (delegate == nil/NULL), mais même s'il est vraiment sorti, il dit toujours que ce n'était pas le cas.

Comment puis-je résoudre ce problème? (Délégué est affecté à un id)

Voici comment mon application est construite:

AppDelegate 
> NavController 
>> TableView 
>>> Post 
>>>> GetData 

GetData est la classe auto-créé. Post est le délégué de GetData et est publié par TableView/NavController. Après avoir relâché Post, il est également réglé à zéro.
En d'autres termes, GetData ne libère pas son délégué!

Répondre

3

Vous ne pouvez pas vérifier si un objet a été libéré. Un autre objet aurait pu venir et occuper le même espace mémoire, devenant indiscernable avec l'objet original.

L'utilisateur d'une classe avec un délégué est responsable de la définition du délégué à nil lorsque l'objet délégué est libéré. Ce n'est pas détectable par l'objet lui-même.

+0

Et si la classe ne libère même pas le délégué, d'autres classes supérieures le font (et le mettent aussi à zéro ...)? – Emil

+0

C'est bien, tant que la référence du délégué de la classe est mise à zéro avant que le délégué lui-même soit libéré. –

+1

Dans votre cas, où 'Post' semble posséder' GetData', ajoutez simplement 'delegate = nil' dans la méthode' -dealloc'. –

5

Le déplacement du contenu d'un pointeur ne définit pas automatiquement le pointeur sur NULL. Vous devez le faire explicitement, par ex.

[delegate release]; 
delegate = nil; 
+0

C'est probablement là que réside mon problème. Voir la question mise à jour (en quelques minutes) – Emil

+0

@Emil: Sans code (ceux qui concernent l'attribution du 'delegate') il est difficile de savoir quel est votre véritable problème. – kennytm

+0

Je l'ai corrigé en conservant le délégué, car la classe GetData se possède elle-même. – Emil

Questions connexes