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:)
Ответы
Ответ 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];
Это сработало для меня.