2009-04-18 7 views
9

Ce code est assez simple, est-il correct? Je ne sais pas si je devrais garder le délégué transmis via la méthode init. Ma première pensée est non, cependant ce bit de code semble indiquer autrement. Je sais que je ne peux pas compter sur les comptes de retenue, mais j'aimerais savoir la bonne façon de traiter avec les délégués.Question sur les délégués

// self's retain count is 1 
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:req delegate:self]; 
// the retain count is now 2, did the init of URLConnection retain self? 
+1

NSURLConnection est un peu un cas particulier. Ce n'est pas tellement qu'il conserve le délégué, mais qu'il le conserve pendant la durée de la connexion, puisque la seule façon d'arrêter de recevoir des messages de délégué est d'annuler la connexion. c'est-à-dire que normalement on ne conserve pas de délégué, et le comportement de NSURLConnection comme ceci est un détail d'implémentation; pas quelque chose que vous devriez compter ou généralement imiter. En outre, il est inhabituel d'avoir un délégué _class_. Normalement, vous déclarez un protocole de délégué. –

+0

Merci Mike, ça explique ce que je vois. – Jab

Répondre

11

Non, en général, vous n'êtes pas censé retenir le délégué. Étant donné que le délégué a déjà une référence à votre objet, si vous avez conservé le délégué, vous créez une référence circulaire, essentiellement. Aussi, pour la même raison, vous pouvez supposer que votre objet sera détruit avant que le délégué ne soit détruit.

Consultez thesearticles pour plus d'informations sur l'utilisation/l'implémentation des délégués.

EDIT: Il y a quelques exceptions, qui ont été signalées par d'autres.

+0

Merci pour les articles, vous avez confirmé ma conviction sur les délégués. Mike m'a aussi expliqué pourquoi je vois ce que je vois avec NSURLConnection dans les commentaires de ma question. – Jab

+2

En fonction de la situation, votre objet ne peut pas être détruit en premier, mais il aura au moins le délégué non défini. (exemple: UIAccelerometer) – rpetrich

1

Comme le dit htw, vous ne devriez généralement pas conserver le délégué. Dans un environnement multithread, vous devez souvent conserver tout ce dont vous avez besoin, même si, pour une durée d'appel de méthode, pour ne pas être invalidé derrière votre dos. Si, par exemple (pas réellement le cas), le -[NSURLConnection initWithRequest:delegate] a créé un nouveau thread que le thread peut avoir retenu (alors probablement autorelease) ses paramètres. En réalité, NSURLConnection est un cas particulier en ce qu'il conserve son délégué pour la durée de la connexion.