2009-09-09 8 views
2

J'ai un UIViewController qui contient un UIWebView (OS 3.0). Si je charge avec les données de fichiers, dès que le bouton « Retour » est frappé et la vue est rejeté, je vois EXEC_BAD_ACCESS erreur avec l'objet WebCore libérant « SharedBuffer »Mémoire fuite UIWebView lors du chargement à partir du fichier au lieu de l'URL?

- (void)viewDidLoad { 
    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:fileName ofType:@"html"]; 
    NSData *fileHtmlData = [NSData dataWithContentsOfFile:htmlFile]; 
    [webView loadData:fileHtmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]];  
} 

Si je change ci-dessus charger par demande, tout va bien.

NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[webView loadRequest:request]; 

Dans dealloc de mon contrôleur, je libère WebView ce qui suit:

[webView setDelegate:nil]; 
[webView release]; 

trace de la pile est inférieure à:

#2 0x359d34ae in WebCore::SharedBuffer::~SharedBuffer 
#3 0x358fdab8 in WebCore::DocumentLoader::~DocumentLoader 
#4 0x332d3c00 in WebDocumentLoaderMac::~WebDocumentLoaderMac 
#5 0x358fec8c in WebCore::FrameLoader::detachFromParent 
#6 0x332d8830 in -[WebView(WebPrivate) _close] 
#7 0x332d8757 in -[WebView close] 
#8 0x332d86db in -[WebView dealloc] 
#9 0x35890719 in WebCoreObjCDeallocOnWebThreadImpl 
#10 0x358d29ce in HandleWebThreadReleaseSource 

Y at-il autre chose que je dois faire pour éviter la fuite/erreur bad_access?

+0

Euh, pourquoi parlez-vous d'une fuite ici? Tout ce que je vois que vous décrivez est un accident. Où est la fuite de mémoire? (désolé, cela aurait dû être posté comme un commentaire, pas comme une réponse.) Trop tard, on ne peut même pas supprimer ses propres messages après les avoir soumis il y a quelques secondes. –

Répondre

0

avère que vous devez faire les étapes décrites ici:

https://devforums.apple.com/message/10741#10741

spécifiquement la suggestion faite par Jim:

- (void)webViewDidStartLoad:(UIWebView *)webView 
{ 
    [webView.delegate retain]; 

    // logic ... 
} 
- (void)webViewDidFinishLoad:(UIWebView *)webView 
{ 
    // logic ... 

    [webView.delegate release]; 
} 
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
{ 
    // error logic ... 
    [webView.delegate release]; 
} 

-(void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 

    if (m_webView.loading) 
    { 
     [m_webView stopLoading]; 
    } 

    // further logic ... 
} 

- (void)dealloc { 
    m_webView.delegate = nil; 
    [m_webView release]; 
    ... 
    [super dealloc]; 
} 
Questions connexes