Как удалить кеш из UIWebview или dealloc UIWebview - PullRequest
9 голосов
/ 10 сентября 2010

Каждый раз, когда я загружаю новую страницу с помощью UIWebView, ранее загруженная страница отображается в течение короткого времени.

Как очистить этот кеш?Другой возможностью было бы сдать 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;
}

Ответы [ 6 ]

28 голосов
/ 20 октября 2010

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

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

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

10 голосов
/ 29 сентября 2010

Моим решением этой проблемы было создание 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 не будет выпущен, вы должны проверить его счет и понять, кто его хранит.

4 голосов
/ 07 февраля 2012

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

[[NSURLCache sharedURLCache] removeAllCachedResponses];
2 голосов
/ 19 января 2011

Я сделал что-то попроще, я просто установил 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;
}

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

2 голосов
/ 03 октября 2010

Если бы мне пришлось угадывать, ваша собственность для 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 голосов
/ 12 апреля 2012

Вы также можете загрузить @ "about: blank" после исчезновения веб-просмотра, тогда оно будет пустым при следующем обращении к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...