2009-09-23 7 views
1

En regardant le UIWebView docs, il est dit queUIWebView confusion de libération de délégué

Avant de libérer une instance de UIWebView pour lequel vous avez défini un délégué, vous devez d'abord définir la propriété délégué UIWebView à zéro avant de disposer de la Instance UIWebView. Cela peut être fait, par exemple, dans la méthode dealloc où vous disposez de l'UIWebView

Je crée une webview à la volée sur une tapeune cellule UITableView. Je ne suis pas sûr de savoir comment faire le bit "set delegate to nil", car je ne suis pas le UIWebView après son push à la pile de navigation. J'aurais cependant que la méthode dealloc de UIWebView appelait de toute façon la release sur le délégué?

Voici ce que je fais:

UIWebView *webView = [[UIWebView alloc] init]; 
UIViewController *viewController = [[UIViewController alloc] init]; 
// Start the webview loading, etc 
... 
// set the delegate 
[webView setDelegate:self]; 
// Add the webview to the viewcontroller 
[viewController setView:webView]; 
[[self navigationController] pushViewController:viewController animated:YES]; 
[webView release]; 
[viewController release]; 

J'ai l'impression que je devrais écrire

[webView release]; 
[viewController release]; 
[self release]; // Releasing the delegate as per the docs. 

Mais cela semble un peu bizarre, ou ai-je interpréter correctement?

Répondre

2

n ° webView ne libère pas/conserver c'est déléguer attribuer seulement il

UIWebView.h:

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

Vous pouvez vérifier [auto retainCount] avant et après [webView setDelegate: auto] Ce sera pareil

+0

Il peut encore être important à zéro le pointeur de délégué. Je ne l'ai pas vu avec UIWebview, mais MKMapView va parfois continuer à envoyer des messages de délégué après sa sortie (je ne sais pas pourquoi, semble tomber sous un comportement inattendu pour moi). – pzearfoss

+0

Cela signifie donc que les documents sont probablement trompeurs? Ce que j'ai écrit en premier est correct? –

+0

Notez également qu'Apple recommande de ne pas vérifier retainCount sur les instances au moment de l'exécution, car cela risque d'induire en erreur. – theLastNightTrain

2

Je viens de le remarquer, vieux maintenant mais peut-être qu'une réponse sera utile à quelqu'un. Les docs sont corrects, vous devez définir la référence de délégué à zéro avant de libérer la vue Web.

Dans votre exemple de code, vous devez sous-classer UIViewController et, dans la sous-classe, remplacer la méthode -dealloc pour inclure une annulation du délégué de vue.

Par exemple:

- (void)dealloc { 
    // Clear the webview delegate 
    self.view.delegate = nil; 
    [super dealloc]; 
} 

HTH

+0

Vous rencontrerez des avertissements à moins que le compilateur ne sache que vous avez affaire à un UIWebView. Pour une sous-classe UIViewController simple, procédez comme suit: - (void) dealloc { UIWebView * webView = (UIWebView *) self.view; webView.delegate = nil; [super dealloc]; } – sdsykes

+0

L'utilisation d'un accesseur (c'est-à-dire self.view) dans votre dealloc n'est pas une bonne pratique. – Snowcrash