0

J'utilise une classe NSXMLParser dans mon programme et je lui assigne un délégué. Ce délégué, cependant, est retenu par la méthode setDelegate: résultant en un mineur, mais ennuyant :-), fuite de mémoire.Délégué de NSXMLParser et fuite de mémoire

Je ne peux pas libérer la classe de délégué après le setDelegate: parce que le programme va planter.

Voici mon code:

self.parserDelegate = [[ParserDelegate alloc] init]; //retainCount:1 
self.xmlParser = [[NSXMLParser alloc] initWithData:self.xmlData]; 
[self.xmlParser setDelegate:self.parserDelegate]; //retainCount:2 
[self.xmlParser parse]; 
[self.xmlParser release]; 

ParserDelegate est la classe déléguée.

Bien sûr, si je définis 'self' comme délégué, je n'aurai aucun problème mais j'aimerais savoir s'il existe un moyen d'utiliser une classe différente en tant que délégué sans fuites.

Merci d'avance.

Répondre

2

De l'documentation sur setDelegate:

«. Un objet qui est le nouveau délégué Il n'est pas retenu Le délégué doit être conforme au protocole Protocole NSXMLParserDelegate. »

Donc, pas de soucis. En outre, même s'il était conservé, une classe NSXMLParser appropriée libérerait le délégué dans 'dealloc'. Donc je ne pense pas que vous ayez une fuite.

La raison pour laquelle vous écraser, vous est désaffecter le délégué, puisque vous apporter Retain décompter à 0.

+0

Donc je ne devrais pas m'inquiéter même si cela montre comme une fuite dans les instruments? De plus, puisque j'arrive à retainCount: 2 après la méthode 'setDelegate:' (d'après Instruments), quand le compte passe-t-il à 0? –

+0

C'est très étrange que vous obteniez une seconde retenir. Vous dites qu'il se bloque si vous avez cette version dans le code ci-dessus, ou lorsque vous ajoutez une seconde version pour contrer le 2 retenir nombre? Si ce dernier, il semble que quelque chose d'autre le retient. – bobDevil

+0

Le premier. Il se bloque si je le libère juste après la [release self.xmlParser]. Pourrait-il y avoir un bug dans l'outil Instruments? Je n'arrive pas à comprendre comment 'setDelegate' retient le délégué ... –

0

Si vous avez la propriété parserDelegate ensemble comme retain et en utilisant les méthodes de synthèse (en utilisant self) pour le régler au départ, alors c'est probablement votre fuite.