UIWebView - Когда (или как) происходит Выпустить CFData?

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

Короче говоря, моя проблема в том, что мое приложение вылетает после интенсивного использования (> 10 минут) UIWebView (например, при открытии больших новостей бумажные сайты последовательно - один за другим).

Чтобы дать более подробную информацию: Я пишу приложение для iPhone и из MainViewController нажимаю browserViewController на navigationController. BrowserViewController загружает перо, содержащее UWebView (я не создаю WebView программно). UIWebView подключается с помощью Interface Builder.

При возврате к Main и последующем переходе к browserViewController я воссоздаю browserViewController только в том случае, если он равен нулю. (Я хочу сохранить содержимое, которое загружается в UIWebView - только если есть предупреждение о памяти, чтобы это представление было выгружено и освободить всю используемую память).

И в MainViewController, и в browserViewController я отвечаю на предупреждения о памяти, но это, кажется, не приносит достаточного облегчения.

Глядя на инструменты, я заметил, что, например, CFData (store) продолжает увеличиваться. Кто управляет CFData?

См. Ниже мой упрощенный пример кода:

MainViewController.h

//  MainViewController.h
#import "myAppDelegate.h"
#import "BrowserViewController.h"

@interface MainViewController : UIViewController {
    BrowserViewController *browViewController;
}

- (void) switchToBrowserViewController;

@end

MainViewController.m

//  MainViewController.m
#import "MainViewController.h"

@implementation MainViewController

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    [browViewController release];
    browViewController = nil;
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (void)dealloc {
    [browViewController release];
    browViewController = nil;
    [super dealloc];
}

- (void) switchToBrowserViewController {

    // create new browViewController if needed
    if ( browViewController == nil ) {
        browViewController = [[BrowserViewController alloc]     initWithNibName:@"BrowserViewController" bundle:nil];
    }

    browViewController.navigationItem.hidesBackButton = YES;

    [((myAppDelegate *)[UIApplication sharedApplication].delegate).navController setNavigationBarHidden:YES animated:NO];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration: 1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:
  ((myAppAppDelegate *)[UIApplication sharedApplication].delegate).navController.view cache:YES];

    [((myAppAppDelegate *)[UIApplication sharedApplication].delegate).navController pushViewController:browViewController animated:NO];
    [UIView commitAnimations];

}

@end

BrowserViewController.h

//  BrowserViewController.h

#import <UIKit/UIKit.h>
#import "myAppDelegate.h"

@interface BrowserViewController : UIViewController <UIWebViewDelegate> {
    IBOutlet UITextField *browserURLField;
    IBOutlet UIWebView *browserWebView;
}

@property (nonatomic, retain) UIWebView *browserWebView;

- (void) loadURLinBrowser;

@end

BrowserViewController.m

//  BrowserViewController.m
#import "BrowserViewController.h"

@implementation BrowserViewController
@synthesize browserWebView;

- (void)viewDidLoad {
    [browserWebView setDelegate:self];
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
}

- (void)viewDidUnload { 
    [super viewDidUnload];

    [browserWebView stopLoading];
    [browserWebView setDelegate:nil];
    [browserWebView removeFromSuperview];
    [browserWebView release];
    browserWebView = nil;

    browserURLField = nil;
}

- (void)dealloc {
    [browserURLField release];

    browserWebView.delegate = nil;
    [browserWebView stopLoading];
    browserWebView = nil;
    [browserWebView release];

    [super dealloc];
}

- (void) switchBackToMainViewController {

    [((myAppDelegate *)[UIApplication sharedApplication].delegate).navController setNavigationBarHidden:NO animated:NO];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration: 1];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:((myAppAppDelegate *)[UIApplication sharedApplication].delegate).navController.view cache:YES];

    [((myAppAppDelegate *)[UIApplication sharedApplication].delegate).navController popViewControllerAnimated:NO];

    [UIView commitAnimations];
}

- (void) loadURLinBrowser {
    NSURL *url = [[NSURL alloc] initWithString:browserURLField.text];
    NSMutableURLRequest *request = [[NSURLRequest alloc] initWithURL: url];
    [browserWebView loadRequest: request];
    [request release];
    [url release];
}

@end

Я пробовал различные рекомендации из других сообщений. Например:

  • 1) Загрузка пустой страницы в WebView.

      NSString * html = @ "     ";
     [browserWebView loadHTMLString: html baseURL: nil];
    
  • 2) использование removeAllCachedResponses в различных местах приведенного выше кода

      [[NSURLCache sharedURLCache] removeAllCachedResponses];
    
  • 3) setSharedURLCache также не помог (я также использовал это в приложении AppDelegateDidFinishLaunching).

      NSURLCache * sharedCache = [[выделение NSURLCache] initWithMemoryCapacity: 0 diskCapacity: 0 diskPath: nil];
     [NSURLCache setSharedURLCache: sharedCache];
     [выпуск sharedCache];
    

К сожалению, ничто из этого не помогло «очистить кэш» или освободить память, выделенную CFData (хранилище).

Если бы кто-нибудь мог пролить свет на это и сообщить мне, что я упускаю или делаю неправильно, я был бы очень признателен.

.
.

Редактировать:
После первоначального ответа от KiwiBastard я добавил снимок экрана, который показывает, что я наблюдаю в инструментах:

enter image description here

.
.

Правка от июня 2010 г .:
Мне все еще не удалось решить эту проблему.
Во второй попытке я создал UIWebView полностью программно.
По-прежнему та же проблема. Однако я заметил странное поведение. Если я загружаю, например, PDF-документ в webView и не прокручиваю PDF-страницу вверх или вниз, webView и данные будут успешно выпущены. Однако как только я перехожу на вторую страницу, освобождение больше не будет работать, и моему приложению в какой-то момент не хватит памяти. Это совершенно странно, и я не могу решить эту проблему.
Есть идеи? Помогите?

14
задан JasonMArcher 5 November 2014 в 23:51
поделиться