Comment autoriser l'object à être libéré sur callback?

J'ai une class écrite en objective C qui fonctionne un peu en se connectant au réseau. Cette class fait ce travail de manière asynchronous et l'user donne un délégué qui est appelé une fois l'opération terminée (avec réponse si succès ou erreur si échec). Le délégué est appelé lorsqu'il n'y a plus de travail à faire et que l'object peut être libéré.

Maintenant je veux soutenir un cas d'utilisation quand l'user libérera l'object de ma class dans l'appel à ce délégué. C'est calme naturel puisque les instances de ma class ne sont pas réutilisables. Actuellement, lorsque mon appel revient de callback, il essaie de continuer d'où il est parti seulement pour find qu'il a été libéré. Inutile de dire que l'application se bloque à ce moment-là.

Je sais que cela peut être fait parce NSURLConnection class NSURLConnection fait. Il est correct de libérer l'object de connection dans la connection callback - (void)connectionDidFinishLoading:(NSURLConnection *)connection . Comment puis-je accomplir la même chose?

MODIFIER:

Voici le code pour mieux le comprendre:

 @class MyRequest; @protocol MyDelegate - (void)completedRequest:(MyRequest*)request; @end @interface MyRequest : NSObject { id<MyDelegate> myDelegate; //variables... } - (id)init; - (id)initWithUrl:(NSSsortingng*)url delegate:(id<MyDelegate>)delegate; - (void)dealloc; - (void)fire; @property (nonatomic, readonly) bool fired; @property (nonatomic, readonly) NSInteger resultCode; @property (nonatomic, readonly) NSSsortingng *errorMessage; @end 

L'user crée l'object de MyRequest et envoie fire message d' fire . MyRequest utilise en interne NSURLConnection pour effectuer le travail. Lorsque la réponse est reçue, j'appelle le délégué donné par l'user.

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection { NSLog(@"In connectionDidFinishLoading..."); resultCode = RESULT_SUCCESS; [urlConnection release]; [urlRequest release]; if (myDelegate != nil) [myDelegate completedRequest:self]; } 

Ajoutez simplement [[self retain] autorelease] avant d'appeler le callback de délégué pour prolonger la durée de vie de votre object. Cela le fera sortir plus tard pour que vous puissiez finir.

Une autre approche consiste à utiliser la méthode performSelectorOnMainThread de NSObject . performSelector... machines conservent votre object, appellent la méthode, puis la relâchent par la suite. Si vous faites attendre la fin de la méthode performSelector, vous aurez le même problème que vous, car vous serez désalloué pendant cet appel. Si vous n'attendez pas qu'il soit terminé, vous ne devriez pas avoir de problème de memory, mais vous ne pouvez rien faire une fois que c'est fait. Si c'est acceptable, alors ça devrait aller.