2009-12-04 4 views
0

Je suis actuellement en utilisant de manière asynchrone NSURLConnection avec plusieurs UIViews (chaque vue gère NSURLConnection en tant que délégué). Le problème que j'ai est quand l'utilisateur bascule des vues trop rapidement et le délégué devient NSZombie les accidents de l'application - c'est NSURLConnection n'a plus de délégué vivant plus. Donc, la première question est de savoir s'il y a un moyen de contourner cela?Comment gérer NSZombies dans un NSURLConnection asynchrone?

La deuxième question est simple - comment puis-je gérer NSZombie? Simple if(myObject != nil).. ne fonctionne pas du tout.

Répondre

7

Vous devez cancel le NSURLConnection avant de disposer de son délégué. Gardez simplement une référence à la connexion NSURLConnection dans votre UIView qui agit en tant que délégué et appelez [urlConnection cancel]. Après la publication d'un message, vous devez définir votre pointeur sur zéro si vous continuez à utiliser ce pointeur. A titre d'exemple:

id myObject = [[SomeObject alloc] init]; 

/* Some code */ 

[myObject release]; 
myObject = nil; 

/* Some more code */ 

if (myObject != nil) { 
    [myObject doSomething]; 
} 

Avis cependant qu'il est valide pour envoyer un message à nil de sorte que vous n'avez pas besoin de garde en toute sécurité le message d'envoi. Il n'aura simplement aucun effet si myObject == nil.

+0

Merci, [cancel] à l'intérieur de viewWillDisappear était la bonne solution. – cocoapriest

+0

Bien que l'annulation de la connexion soit une bonne pratique pour des raisons de trafic, la méthode de démarrage de NSURLConnection conserve le délégué de la connexion. Le délégué ne doit donc pas devenir un zombie sauf si vous avez outrepassé le délégué. C'est déjà un zombie avant d'appeler [connexion start]. – dgatwood

Questions connexes