Je suis en train de fixer un tas de fuites que mon UIWebView
est à l'origine et ne peuvent pas trouver leur origine, ni une solution de contournement. Ce que je fais est d'obtenir le contenu du Web par le biais d'une demande de réseau, puis assembler mon code HTML et le charger à la volée:fuites de mémoire avec UIWebView et Javascript
NSString* body = <some HTML>;
NSString* html = [NSString stringWithFormat:kHTMLTemplate, [self scripts], [self styles], body];
[_webView loadHTMLString:html
baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
Chaque fois qu'il ya du nouveau contenu disponible, j'execute loadHTMLString
à nouveau pour rafraîchir l'affichage Web . Je réutilise la même vue web, le même contrôleur, même chose.
Instruments montre un modèle très étrange où tous les objets sont d'ordre général fuite des blocs de différentes tailles et aucune d'entre eux a des informations qui s'y rattachent: pas de bibliothèque responsable, pas de cadre responsable, etc. Chaque fois loadHTMLString
est exécuté , de nouvelles fuites sont ajoutées.
Il semble qu'il y ait plusieurs threads dans S.O. environ UIWebView
fuite de mémoire. J'ai essayé toutes les suggestions que j'ai trouvées (par exemple, mettre le NSURLCache
à zéro, ou le réinitialiser, j'ai essayé de libérer l'UIWebView existant et d'en allouer un nouveau chaque fois que j'ai de nouvelles données, etc.) mais rien n'a aidé.
Mes recherches jusqu'à maintenant conduire à un résultat clair: il semble que les fuites ne sont présents que si le code HTML je charge dans la vue contient du Javascript. Si vous remarquez la chaîne html
ci-dessus, elle est composée de plusieurs composants; on est [self scripts]
qui est une fonction qui retourne simplement:
return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>"
"<script type='text/javascript' src='jmy.js'></script>";
Si je retire cela, pas de fuite sont là. Mais les fuites apparaissent dès que j'ajoute une balise <script>
à mon HTML. Ils apparaissent même si j'inclure simplement le fichier jquery (ou tout autre fichier js, à ce sujet):
return @"<script type='text/javascript' src='jquery-1.4.4.min.js'></script>";
Ainsi, la question: quelqu'un at-il une idée de ce qui se passe ici? Clairement inclure un fichier Javascript dans mon HTML rend la mémoire de fuite UIWebView
.
Le fait que les fuites apparaissent à la fois quand je réutiliser le même objet UIWebView
ou quand j'instancier un nouveau chaque fois que j'ai contenu, me conduit à penser qu'il doit y avoir quelque chose dans la manière dont les fichiers javascript sont gérés par loadHTMLString
qui conduit aux fuites.
Est-ce que quelqu'un sait comment cela pourrait être fixé?
Cela peut être un bogue dans UIWebView. http://blog.techno-barje.fr/post/2010/10/04/UIWebView-secrets-part1-memory-leaks-on-xmlhttprequest/ –
@ H2CO3: merci, j'ai aussi essayé ça ... pas d'améliorations. .. – sergio
pense que nous sommes sauvés par iOS 8. Commander cette réponse sur WKWebView http://stackoverflow.com/questions/16514230/massive-memory-leak-in-ui-uiwebview –