2010-09-10 5 views
8

Каждый раз, когда я загружаю новую страницу с UIWebView, страница, загруженная до загрузки, отображается на короткое время.Как удалить кеш из UIWebview или dealloc UIWebview

Как я могу очистить этот кеш? Другая возможность - dealloc UIWebview. Я пробовал это, но мой UIWebView всегда «пуст». Как следует делать в этом случае alloc и dealloc?

Я заметил, что UIWebView потребляет около 10 МБ ОЗУ. Теперь загружается UIWebView вместе с ViewController. И просмотр автореализован, а также UIWebView. Разве не было бы лучше отключать WebView каждый раз?

Решение:

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    CGRect frame = CGRectMake(0, 0, 320, 480); 
    self.webView = [[[UIWebView alloc]initWithFrame:frame] autorelease]; 
    self.webView.scalesPageToFit = YES; 
    [self.view addSubview:self.webView]; 
} 

- (void) viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    [self.webView removeFromSuperview]; 
    self.webView = nil; 
} 

ответ

10

Мое решение этой проблемы было создание UIWebView программно на viewWillAppear: и выпустить его на viewDidDisappear:, как это:

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    self.webView = [[[UIWebView alloc]initWithFrame:exampleFrame] autorelease]; 
    self.webView.scalesPageToFit = YES; 
    self.webView.delegate = self; 
    self.webView.autoresizingMask = webViewBed.autoresizingMask; 
    [exampleView addSubview:self.webView]; 
} 
- (void) viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 

    [self.webView removeFromSuperview]; 
    self.webView.delegate = nil; 
    self.webView = nil; 
} 

Если вы сделаете это и ваш UIWebView не освобождается, вы должны проверить его количество и понять, кто его удерживает.

+0

Что такое ExampleFrame, webViewBed и exampleView? Что такое autoresizingMask? Я не реализую протокол UIWebViewDelegate, поэтому мне не нужен делегат. 'addSubview' не работает для меня, потому что мой' UIViewController' не поддерживает это. Насколько я вижу, вы не публикуете веб-представление на 'viewDidDisappear'. Вы удаляете его только из супервизора и устанавливаете его в 'nil'. Я пробовал ваш подход, и я вижу только белый экран. Я редактировал свой вопрос, чтобы вы могли видеть мой код. – testing

+0

exampleFrame - это только размер создаваемого вами UIWebView. webViewBed не должен быть частью этого примера, он не полезен в этом контексте. exampleView - это представление, к которому вы добавляете UIWebView. И, конечно, вы добавляетеSubview() в Views, а не для просмотра контроллеров. Поэтому вам нужно будет сделать что-то вроде [viewController.view addSubview: ...]. Я выпускаю webview, это свойство (см. «Я»?), Поэтому вы можете установить его на ноль, и он будет выпущен. – mips

+0

Perfect !! Это единственное решение в Интернете, которое я нашел для работы !! – Ravikant

2

Если бы я должен был сделать предположение вашей собственности для WebView является

@property (nonatomic, retain) IBOutlet UIWebView *webView; 

Правильно? Важной частью является сохранение.

self.webView = [[UIWebView alloc]initWithFrame:frame]; 

Приведенный выше код выделяет UIWebView (значение retainCount = 1), а затем добавляет ее в self.webView, где она удерживается снова (retainCount = 2).

Измените код на следующий, и ваш webView должен быть освобожден.

self.webView = [[[UIWebView alloc]initWithFrame:frame] autorelease]; 

addSubview: можно назвать только UIViews.

//[self.navigationController addSubview:self.webView]; 

должен быть

[self.navigationController.view addSubview:self.webView]; 
+0

Вы правы. Но я не понимаю, почему подсчет сохранения в 2 приводит к тому, что веб-просмотр отображает белый экран. Спасибо за помощь. Кому я должен поставить галочку? Это сложно ... – testing

+0

Я не знаю, что или даже если белый экран имеет какое-то отношение к этой проблеме. Но если у вас проблемы с управлением памятью, сложно отладить другие проблемы. Поэтому сначала исправьте управление памятью и исследуйте дальше проблему белого экрана. –

27

У меня была почти такая же проблема. Я хотел, чтобы кэш веб-просмотра был очищен, потому что каждый раз, когда я перезагружаю локальную веб-страницу в UIWebView, отображается старая. Поэтому я нашел решение, просто установив свойство cachePolicy запроса. Для установки этого свойства используйте NSMutableURLRequest. При всем этом все отлично работает при перезагрузке UIWebView.

NSURL *url = [NSURL fileURLWithPath:MyHTMLFilePath]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
[self.webView loadRequest:request]; 

Надеюсь, что это поможет!

+0

это решило мою проблему! спасибо – jithinroy

+2

, это не решило мою проблему по любой причине. Я предполагаю, что это ошибка в API. – markshiz

+0

Спасибо: «removeAllCachedResponses» не сработал для меня, но это произошло. – user621267

2

Я сделал что-то более простое, я просто установил alpha для webView в 0 на loadRequest и 1 на webViewDidFinishLoad.

thewebview.alpha=0.0; 
thewebview.backgroundColor=[UIColor whiteColor]; 
[thewebview loadRequest:[NSURLRequest requestWithURL:url(str)]]; 

и

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    thewebview.alpha=1.0; 
} 

(На самом деле у меня есть замирание-в, так как рендеринг f.ex. в PDF может занять 1/5 секунды или около того.)

+2

Установка значения alpha удаляет кеш? Это должно быть неправильно. –

4

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

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 
0

вы также можете загрузить @ «о: пустой» после того, как WebView исчезает, то он будет пуст при следующем доступе к нему.