2008-12-30 11 views
1

que je fais quelque chose comme ceci:Comment puis-je vérifier si un délégué est valide?

@protocol CallbackDelegate 
-(void) performCallback; 
@end 

@interface MyObject : NSObject { 
    id<CallbackDelegate> delegate; 
} 

-(void)AsyncFuncCall; 

@end 

@property (nonatomic, assign) id<CallbackDelegate> *delegate; 

Le code qui possède MyObject met en place un délégué pour recevoir la fonction de rappel:

MyObject *myobject = [[MyOject alloc] init]; 
myobject.delegate = x; 

Puis, en MyObject, à la suite d'une fonction asynchrone appel je vais signaler au délégué:

-(void)AsyncFuncCall { 
    [delegate performCallback]; 
} 

Tout semble bien fonctionner la plupart du temps, sauf pour le occasions où mon délégué a été libéré à la suite d'un nettoyage de la mémoire valide. Dans ce cas, je veux simplement ne pas effectuer le rappel

Est-ce que quelqu'un sait le meilleur moyen de vérifier si un délégué est valide?

J'ai essayé toutes sortes de choses telles que:

if (delegate != nil) { 
    ... 
} 

sans chance.

Répondre

4

Votre délégué devrait nul sur la propriété délégué myObject dans son dealloc pour éviter ceci:

- (void) dealloc { 
    if (myObject.delegate == self) myObject.delegate = nil; 
    [super dealloc]; 
} 

Alternativement, mais pas recommandé, vous pouvez conserver le délégué. Cependant, cela peut conduire à retain cycle.

+0

Génial, cela semble devoir fonctionner aussi! Avant, je retenais des délégués pour contourner les problèmes que j'avais - mais mon code avait l'air tellement en désordre et ça ne me paraissait pas très bien. Votre solution ci-dessus ressemble à cela. Merci encore, Nick. –