2008-11-11 7 views
4

Aidez-nous! J'ai regardé cela pendant 12 heures; et ont regardé en ligne et ne peuvent pas trouver de solution.iPhone - Fuite de mémoire - NSData dataWithContentsOfUrl & UIWebView

Dans mon application, j'utilise 2 contrôles UIView dans les pages/contrôleurs séparés:

  • UIImageView (récupérer des données via NSData dataWithContentsOfUrl)
  • UIWebView

Juste pour isoler mon code, et le rendre plus facile à expliquer, j'ai créé un nouveau projet basé sur la vue appelé "MyTestApplication"

1 - J'ai ajouté un si mple NSData dataWithContentsOfUrl dans la fonction déléguée.

NSData *imageData = [NSData dataWithContentsOfURL: 
    [NSURL URLWithString:@"http://www.google.com/intl/en_ALL/images/logo.gif"]]; 

(Rien à libérer ici car il est tout en utilisant les fonctions de commodité)

alt text http://img.skitch.com/20081110-j5tn5n7ixph95ys4rpchibaw5p.preview.jpg

View Image

2 - Exécuter pour vérifier aucune fuite (comme prévu)

alt text http://img.skitch.com/20081110-fy2qrkgy47hm4fe2f1aakd4muw.preview.jpg

View Image

3 - Ouvrez le ViewController.xib et simplement ajouter un UIWebView de la bibliothèque (pas besoin de le câbler)

alt text http://img.skitch.com/20081110-d63c3yh1a1kqiciy73q8uyd68j.preview.jpg

View Image

4 - Exécuter pour vérifier il sont des fuites! (Pourquoi ???)

alt text http://img.skitch.com/20081110-qtxcfwntbcc3csabda3r6nfjg6.preview.jpg

View Image

Qu'est-ce que je fais mal? S'il vous plaît aider!

Pourquoi NSData provoquerait-il une fuite de mémoire si j'utilise UIWebView? Je ne comprends pas. Merci.

Répondre

4

Je pense que c'est ce qui se passe:

Lorsque ViewController.xib est chargé, une instance de UIWebView est alloué et initialisé. Étant donné que vous ne le branchez pas n'importe où, il n'est pas libéré. Je pense que vous avez besoin de le câbler et de le relâcher dans la fonction dealloc de View Control. Je me souviens d'avoir à libérer manuellement tous les objets que j'ai créés dans un fichier xib.

+0

pas vrai. Les éléments du fichier xib sont conservés par 'initWithNib' du contrôleur de vue et sont libérés lorsque le contrôleur de vue est désalloué. et dans tous les cas, si cela était vrai, cela montrerait aussi la vue web et NSData comme fuite, ce qui n'est pas le cas – user102008

1

Courez-vous des fuites sur le simulateur? Si oui, caveat coder. Le simulateur fuira la mémoire là où le matériel de l'iPhone ne le fera pas. Aucun simulateur ne correspond parfaitement au comportement exact de votre code sur l'appareil.

Je voudrais également tester sur l'appareil. J'ai juste fait la même chose sur un problème similaire avec UITableViewController qui fuyait dans le Sim mais pas au téléphone.

5

J'avais aussi des problèmes avec les fuites de dataWithContentsOfURL: de NSData dans le simulateur d'iPhone. J'ai trouvé que lorsque j'utilisais l'autre méthode de commodité (dataWithContentsOfURL:options:error:) je n'obtiendrais pas la fuite de mémoire.

Mon code ressemble à ça:

NSURL *url = [NSURL URLWithString:urlString]; 
NSError *error = nil; 
NSData *data = [NSData dataWithContentsOfURL:url 
            options:0 
             error:&error]; 

Link to documentation

+0

J'ai vu cette même fuite dans OS 3.1.2 (sur sim et 3GS). Votre suggestion l'a corrigé! Bizarre que NSDataReadingOptions n'est apparemment pas dans le SDK iPhone? – Jason

0

[NSData dataWithContentsOfURL:url options:0 error:&error] ne m'a pas aidé sur iOS8.

Mais suivant fonctionne correctement:

NSURLRequest* request = [NSURLRequest requestWithURL:imageURL]; 
NSData* imageData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
[[NSURLCache sharedURLCache] removeCachedResponseForRequest:request]; 

Code de production aurait besoin également des paramètres de réponse et d'erreur.