iPhone - утечка памяти - NSData dataWithContentsOfUrl & UIWebView - PullRequest
5 голосов
/ 11 ноября 2008

Пожалуйста, помогите! Смотрели на это в течение 12 часов; и посмотрел онлайн и не может найти решение.

В моем приложении я использую 2 элемента управления UIView на отдельных страницах / контроллерах:

  • UIImageView (получить данные через NSData dataWithContentsOfUrl)
  • UIWebView

Чтобы изолировать мой код и упростить его объяснение, я создал новый проект на основе представления под названием «MyTestApplication»

1 - я добавил простой NSData dataWithContentsOfUrl в функцию делегата.

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

(Здесь нечего выпускать, поскольку все это использует вспомогательные функции)

альтернативный текст http://img.skitch.com/20081110-j5tn5n7ixph95ys4rpchibaw5p.preview.jpg

Просмотр изображения

2 - Запустите его, чтобы проверить отсутствие утечек (как и ожидалось)

альтернативный текст http://img.skitch.com/20081110-fy2qrkgy47hm4fe2f1aakd4muw.preview.jpg

Просмотр изображения

3 - Откройте ViewController.xib и просто добавьте UIWebView из библиотеки (не нужно подключать его)

альтернативный текст http://img.skitch.com/20081110-d63c3yh1a1kqiciy73q8uyd68j.preview.jpg

Просмотр изображения

4 - Запустите его, чтобы проверить, есть ли утечки! (Почему ???) * +1043 *

альтернативный текст http://img.skitch.com/20081110-qtxcfwntbcc3csabda3r6nfjg6.preview.jpg

Просмотр изображения

Что я делаю не так? Пожалуйста, помогите!

Почему NSData вызывает утечку памяти, если я использую UIWebView? Я просто не понимаю Благодарю.

Ответы [ 4 ]

5 голосов
/ 18 сентября 2009

У меня также были проблемы с утечками из NSData dataWithContentsOfURL: в симуляторе iPhone. Я обнаружил, что при использовании другого удобного метода (dataWithContentsOfURL:options:error:) я не получаю утечку памяти.

Мой код выглядел примерно так:

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

Ссылка на документацию

4 голосов
/ 11 ноября 2008

Я думаю, что это то, что происходит:

Когда загружается ViewController.xib, экземпляр UIWebView выделяется и инициализируется. Поскольку вы нигде не подключаете его, его не выпускают. Я думаю, что вам нужно подключить его и освободить его в функции dealloc вашего контроллера представления. Я помню, как вручную выпускал каждый объект, который я создал в xib-файле.

1 голос
/ 30 декабря 2008

Вы запускаете Leaks на симуляторе? Если это так, будьте осторожны. Симулятор будет пропускать память, а аппарат iPhone - нет. Ни один симулятор никогда не будет идеально соответствовать точному поведению вашего кода на устройстве.

Я бы тоже проверил на устройстве. Я просто сделал то же самое по аналогичной проблеме с UITableViewController, который просачивался в Sim, но не на телефоне.

0 голосов
/ 25 мая 2015

[NSData dataWithContentsOfURL:url options:0 error:&error] мне не помогло на iOS8.

Но правильно работает:

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

Производственному коду также потребуются параметры ответа и ошибки.

...