2010-11-28 11 views
1

(ou même seulement une classe avec un délégué)Comment libérer plusieurs classes qui ont le même délégué?

Dites que j'ai une classe appelée DataGetter, qui télécharge un fichier à partir du Web. Il a une méthode déléguée, qui se déclenche lorsque le fichier a été téléchargé:

- (void) dataGetterFinished:(DataGetter *)dataGetter; 

Alors somehere dans mon code, je peux mettre en place plusieurs fichiers à télécharger comme ceci:

// in AViewController.m 
DataGetter *blueFile = [[DataGetter alloc] init]; 
blueFile.delegate = self; 
[blueFile getData:@"http://example.com/blue-file"]; 

DataGetter *redFile = [[DataGetter alloc] init]; 
redFile.delegate = self; 
[redFile getData:@"http://example.com/red-file"]; 

L'utilisation clang statique analyseur, chaque ligne alloc ci-dessus obtient une erreur 'fuite potentielle d'un objet affecté en ligne ...'. Alors, comment pourrais-je libérer l'objet. Il doit traîner parce qu'il a un délégué. Alors, est-ce OK pour libérer la dernière ligne de la méthode dataGetterFinished, comme si

- (void) dataGetterFinished:(DataGetter *)dataGetter 
{ 
// code 
[dateGetter release]; 
} 

... ou devrais-je utiliser autorelease en quelque sorte?

Répondre

1

Techniquement, cela fonctionne très bien, mais je suggère de garder une trace des différents DataGetters dans un NSMutableArray.

Par exemple:

DataGetter *blueFile = [[DataGetter alloc] init]; 
blueFile.delegate = self; 
[blueFile getData:@"http://example.com/blue-file"]; 
[dataGetters addObject:blueFile]; // dataGetters is an NSMutableArray declared in the .h 
[blueFile release]; 

// Same for red 

Puis, dans la méthode déléguée, simple retirer le getter du tableau:

- (void) dataGetterFinished:(DataGetter *)dataGetter 
{ 
// code 
[dataGetters removeObject:dataGetter]; 
} 

L'ensemble prend soin de garder l'objet, et vous ne recevez pas l'avertissement d'analyse.

Veillez simplement à libérer dataGetters dans la méthode dealloc.

+0

merci! Quel est l'avantage d'utiliser NSMutableArray plutôt que de simplement libérer la classe dans la méthode déléguée? est-ce simplement pour faire plaisir aux dieux clangés? – cannyboy

+1

Ouais je le dirais, et au cas où vous voulez accéder aux dataGetters plus tard, vous pouvez juste regarder dans le tableau. J'ai toujours pensé que c'était une façon beaucoup plus ordonnée de le faire. –