web-dev-qa-db-fra.com

Libération des ressources UIWebView iOS après utilisation

L'écran d'accueil de notre application (et par conséquent le premier visualisé par tous les utilisateurs) comporte plusieurs sections, dont la plupart contiennent différentes vues Web que l'utilisateur peut souhaiter ouvrir. Cela augmente l'utilisation de la mémoire d'à peine 26 Mo à 85 Mo voire plus (après avoir ouvert toutes les vues Web différentes).

Le problème que nous avons constaté est que, une fois qu'elles sont fermées, toutes les ressources de page Web semblent être conservées en mémoire (la mémoire utilisée diminue à peine de quelques Mo peut-être).

Je voudrais libérer les ressources que la vue Web devait ouvrir car, plus tard, il existe une section très exigeante de notre application qui nécessite beaucoup de mémoire et la bloque complètement si vous avez déjà été en train de naviguer dans plusieurs de ces vues. avant.

J'ai trouvé plusieurs options sur Internet à essayer, mais aucune d'entre elles n'a encore fonctionné. Des choses telles que:

// Try to clean used webview

[self.webView loadHTMLString:@"" baseURL:nil];
[self.webView stopLoading];
self.webView.delegate = nil;
[self.webView removeFromSuperview];
self.webView = nil;

Ils n'ont eu pratiquement aucun effet sur l'utilisation de la mémoire. Y a-t-il quelque chose qui me manque ici? J'ai déjà vérifié deux fois que je n'ai aucune fuite qui maintiendrait la WebView ouverte, je suis déjà en train de libérer la seule référence que j'ai (self.webView = nil;)

Edit: Je viens de créer un projet à partir de rien, d’ajouter une vue Web et un bouton qui charge un site Web différent chaque fois que je clique dessus, ce qui augmente à son tour l’utilisation de la mémoire. J'ai également ajouté un bouton qui détruira la vue Web lorsque l'utilisateur cliquera dessus et, devinez quoi, la mémoire reste la même, comme si elle ne libérait aucune ressource.

28
h4lc0n

Cela fait plusieurs mois que j'ai posé cette question et il semble que personne ne connaisse le moindre travail, alors je me réponds simplement de la clore et, malheureusement, de mauvaises nouvelles pour quiconque a le même problème.

Nous avons essayé de lutter contre ce problème pendant plusieurs jours et, après avoir parlé à des personnes qui nous avaient laissé entendre que nous n'avions rien à faire à ce sujet (c'est simplement un processus différent prenant en charge tout ce à quoi nous n'avons pas accès), nous avons décidé de limiter l'accès aux vues Web aux pages personnalisées.

Par exemple, nous avons eu une section de nouvelles qui a ouvert des sites Web sur Internet. Nous avons fini par créer des pages Web personnalisées contenant le titre, le corps et une image liée à l’actualité (ce qui ajoute encore à l’utilisation de la mémoire ressource, mais nous avons réussi à le conserver dans un petit format contenu qui aurait besoin de milliers de nouvelles à ouvrir pour être en danger). Je sais, pas idéal.

J'aimerais toujours voir des réponses constructives à cette question, qu'il s'agisse d'une solution, d'une solution de contournement ou de toute idée pouvant aider les futurs utilisateurs qui ont le même problème à avoir des indices sur la manière de le gérer.

17
h4lc0n

vous devriez lire cet article de Jason Baker,

http://www.codercowboy.com/code-uiwebview-memory-leak-prevention/

Il a créé une category qui m'a vraiment aidé à réduire l'empreinte mémoire de UIWebView.

il suffit d'appeler deux lignes après l'ajout de la catégorie

-(void) dealloc
{

    [self.webview cleanForDealloc];
    self.webview = nil;
    [super dealloc];

}
7
2intor
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    categoryWebView.stopLoading()
    categoryWebView.removeFromSuperview()
    categoryWebView = nil

    URLCache.shared.removeAllCachedResponses()
    URLCache.shared.diskCapacity = 0
    URLCache.shared.memoryCapacity = 0
    if let cookies = HTTPCookieStorage.shared.cookies {
        for cookie in cookies {
            HTTPCookieStorage.shared.deleteCookie(cookie)
        }
    }
}
1
Sachin Kishore