Подтвердить что ты не робот

UIWebView занимает много памяти

В моем приложении, когда я загружаю UIWebView с любым URL-адресом веб-сайта, память перескакивает с 30 мб до около 140 МБ. Я использую ARC

here is the image for the same
и при отклонении UIWebViewController [Viewcontroller, который содержит UIWebView], он не освобождает память. Может ли любой орган помочь мне решить эти проблемы с памятью, а также предоставить мне указатели на наилучшие возможности памяти в ARC

Для загрузки веб-страницы: -

NSURL *nsurl=[NSURL URLWithString:self.url];
    NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl];
    [webview loadRequest:nsrequest];

FOr Отклонение Viewcontroller: -

[self dismissViewControllerAnimated:YES completion:^{
    webview.delegate=nil;
    webview=nil;
}];

Спасибо в Advance:)

4b9b3361

Ответ 1

ничего себе, сегодня мы также встречаем эту проблему. когда мы пытаемся загрузить веб-страницу, содержащую много фотографий или огромную веб-страницу, легко сбой. мы также находим, что в памяти используется почти 200M.

Наконец, мы обнаруживаем, что мы могли бы удалить кэш памяти веб-представления

[[NSURLCache sharedURLCache] removeAllCachedResponses];

вы можете попробовать, когда вы получите предупреждение о сохранении памяти. или вы можете вызвать его в методе dealloc.

если у него все еще есть некоторые проблемы, попробуйте ограничить размер кеша памяти вызовом

[[NSURLCache sharedURLCache] setMemoryCapacity:size]

Удачи!

Ответ 2

Не слушайте их,

Не проблема, телефоны могут обрабатывать все это использование памяти, попробуйте использовать MKMapView и понаблюдайте за потреблением памяти.

В вашем симуляторе попробуйте ввести предупреждение о низкой памяти cmd+shift+m и посмотреть, что произойдет, вы не можете ожидать, что все веб-представления будут запускаться при одинаковом использовании памяти, также у вас есть шанс для вашего телефона будьте осторожны.

iPhones могут обрабатывать все это, поэтому вам не стоит беспокоиться об этом.

Но попробуйте это в любом случае:

Поведение UIWebViews изменяется, если вы снимите флажок "Обнаруживает ссылки" в файле nib, поэтому попробуйте переключить его и посмотрите, что произойдет.

Ответ 3

  • Используйте вкладку "Использовать инструменты", чтобы увидеть количество экземпляров вашего UIWebViewController в режиме реального времени в памяти. (Cmd + я в Xcode, пусть инструменты открываются, выбирают Allocations и набирают UIWebViewController в строке поиска)
  • Если это больше, чем вы ожидаете, посмотрите на цикл сохранения.
  • Попробуйте использовать слабые ссылки внутри блоков вместо self.
  • Убедитесь, что вы не держите ссылку на объект UIWebViewController на более одного места.
  • Поместите точку останова /NSLog в методе dealloc для вашего viewController, чтобы узнать, будет ли он вызван.

Ответ 4

Нет смысла искать проблему, пока не убедитесь, что проблема существует.

Есть две возможности, почему использование памяти настолько велико:

1.UIWebView не освобождается.

2. Это некоторое системное кэширование или какой-то определенный алгоритм обработки памяти iOS.

Во втором случае вы ничего не можете сделать. Чтобы проверить первый случай, вы можете попытаться использовать инструменты или просто подкласс UIWebView и добавить журнал в метод dealloc.

@implementation MyUIWebView

- (void)dealloc
{
    NSLog(@"MyUIWebView deallocated!");
}

@end

Не забудьте изменить UIWebView в MyUIWebView в вашем коде.

И только если вы убедитесь, что UIWebView не освобожден, вы должны начать поиск сильных указателей, сохранить круги и т.д.

Ответ 5

добавить

if (webView.isLoading){
    webView.stopLoading;
}
webView.delegate=nil;

перед этой строкой

[self dismissViewControllerAnimated:YES completion...]

В то время как ваш webView должен заботиться ARC. Не ссылайтесь на веб-представление в блоке завершения.

Ответ 6

Я думаю, вы забыли удалить UIWebView из иерархии представлений. Это приведет к дополнительному счету удержания и предотвратит восстановление памяти после того, как вы потеряете свойство.

Ответ 7

Только некоторые вещи, которые вы должны проверить:

  • Контроллер имеет ссылку strong на свой view, и этот вид сохраняет все подпункты, пока вы храните их внутри иерархии представлений, поэтому любые дополнительные свойства должны быть weak, включая ваш webView свойство.
  • При использовании ARC нет необходимости "nil" всего. ARC будет nil все свои strong ссылки на dealloc автоматически.
  • Не нужно ничего делать с weak. Более того, ссылки iOS 5+ weak автоматически становятся nil, если ссылочный объект освобождается в другом месте.

Я думаю, что, скорее всего, весь ваш контроллер просмотра будет где-то сохранен и, следовательно, его view и webView.

Убедитесь, что вы сохраняете ссылки weak только на контроллере и сохраняете его в контейнере или представляете контроллер, чтобы он автоматически отпускался до тех пор, пока он всплывает или отклоняется.

Ответ 8

У меня была такая же проблема в моем приложении. Я бы рекомендовал вам использовать WKWebView. WKWebView был представлен с iOS 8. Вы можете прочитать больше об этом здесь документация по яблоку

Проблема с памятью определенно решена. Вы получите всю функциональность от webview и еще несколько (т.е. Прогресс). Надеюсь, что это поможет

Ответ 9

Если вы хотите немедленно сократить использование памяти UIWerview, вы можете попробовать:

1.

[webview loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"about:blank"]]];

или

2.

[webview loadHTMLString: @"" baseURL: nil];

или

3.

[webview loadData:nil MIMEType:nil textEncodingName:nil baseURL:nil];

Это сработало для меня.