Je suis en train d'implémenter un simple navigateur in-app. Dans ma vue d'accueil ( UITableViewController
), j'ai quelque chose comme :
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
WebViewController *webViewController = [[WebViewController alloc] init];
switch (indexPath.row) {
case 0:
webViewController.stringURL = @"http://www.google.com";
break;
case 1:
webViewController.stringURL = @"http://www.bing.com";
break;
default:
webViewController.stringURL = @"http://stackoverflow.com";
break;
}
[self.navigationController pushViewController:webViewController animated:YES];
[webViewController release];
}
L'application s'est écrasé après avoir fait des allers-retours répétitifs entre ma vue d'accueil et webViewController
à plusieurs reprises.
À l'intérieur de WebViewController
je n'ai rien d'autre qu'une classe [UIWebView *webView]
et un [UIActivityIndicatorView *activityIndicator]
. Les deux sont avec des attributs nonatomic, retain
. Voici l'implémentation.
#import "WebViewController.h"
@implementation WebViewController
@synthesize webView, activityIndicator, stringURL;
- (void)dealloc
{
[self.webView release];
self.webView.delegate = nil;
[self.activityIndicator release];
[super dealloc];
}
-(void)loadView {
UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
self.view = contentView;
CGRect webFrame = [[UIScreen mainScreen] applicationFrame];
webFrame.origin.y = 0.0f;
self.webView = [[UIWebView alloc] initWithFrame:webFrame];
self.webView.backgroundColor = [UIColor blueColor];
self.webView.scalesPageToFit = YES;
self.webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
self.webView.delegate = self;
[self.view addSubview: self.webView];
[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.stringURL]]];
self.activityIndicator = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
self.activityIndicator.frame = CGRectMake(0.0, 0.0, 30.0, 30.0);
self.activityIndicator.center = self.view.center;
[self.view addSubview: self.activityIndicator];
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self loadView];
}
- (void)webViewDidStartLoad:(UIWebView *)webView
{
// starting the load, show the activity indicator in the status bar
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
[activityIndicator startAnimating];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// finished loading, hide the activity indicator in the status bar
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
[activityIndicator stopAnimating];
}
@end
Je viens de lancer mon application dans Instruments en utilisant le Modèle de zombies qui montre -[UIWebView webView:didReceiveTitle:forFrame:]
est l'appel du Zombie. Mais je n'arrive toujours pas à comprendre quel est réellement le problème.
(Veuillez télécharger trace si nécessaire)
Toute aide est grandement appréciée !
[Mise à jour] :
- Comme @7KV7 et @David l'ont fait remarquer, il y a un bogue évident dans mes
dealloc
fonction. Je devrais appelerself.webView.delegate=nil;
avant de publierself.webView
. Désolé pour cela. Malheureusement, après avoir corrigé le problème, l'application se bloque toujours de la même manière. - Si je supprime
[webViewController release];
à partir du premier bloc de code, le crash a disparu. Mais évidemment, il y aura une fuite de mémoire.