General-Block 56, 1024, 8, 244, 24 Утечки памяти при использовании UIWebView loadRequest - PullRequest
5 голосов
/ 21 апреля 2011

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

Вот мои настройки:

У меня есть tabbarcontroller, которыйя программно создаю с 4 контроллерами представления: представление таблицы, представление карты, другое представление таблицы и веб-представление соответственно.

  • 1-е представление таблицы показывает статические данные.
  • представление карты показывает аннотациичто при щелчке заполняет переменную 4-й вкладки веб-просмотра и переключается на веб-просмотр для отображения локально сохраненного файла html / javascript, который представляет собой 3d-модель
  • , во втором табличном представлении содержится список всей той же информациикаждая аннотация в представлении карты представлена ​​в виде таблицы.он имеет те же функциональные возможности, что и заполнение переменной, переключение и отображение файла html / javascript в веб-просмотре
  • веб-просмотр отображает загруженный файл html / javascript, если нет, то показывает UIAlertView для выбора одного изmapview или список

Когда я, наконец, доберусь до выполнения loadRequest () из webview, изначально все работает нормально.однако, когда я начинаю переключаться между вкладками и просматривать разные 3d-модели (то есть, перейти к представлению карты, щелкните аннотацию, чтобы показать, скажем, модель x, просмотрите ее загрузку в веб-представлении, затем переключитесь на таблицу листинга и щелкните строку, чтобы показать модельу (или х тоже) и смотреть его загрузку в веб-просмотре) я начинаю получать утечки памяти на ipad, а не на симуляторе.эти утечки памяти почти всегда: General-Block 56, 1024, 8, 244 и 24 и не имеют ответственных фреймов, библиотек или следов стека, которые можно было бы отслеживать.

в веб-просмотре, если я закомментирую строку loadrequest или выполню loadrequest с объектом запроса = nil, у меня нет утечек памяти, но когда я переключаюсь на использование объекта url, который указывает на локальные файлы (ядаже пытался указать ему на google.com, на котором есть javascript) он извергается из-за утечек памяти.

Я пытался выполнить каждый из следующих действий:

  • [self.webView loadRequest:nil];
  • [self.webView loadHTMLString: @ "" baseURL: nil];
  • [self.webView stopLoading];

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

  • Кстати, я использую последнюю версию xcode 4.0.2, а на ipad установлено последнее обновление 4.3.2
  • из предыдущего поста, который я прокомментировал и не получил ответа ( утечка памяти общего блока ). Я считаю, что проблема связана с тем, что webview незнать, как полностью избавиться от javascript, когда я переключаю представления
  • Я провел тест с простым html-файлом без javascript и утечки памяти из общего блока исчезли.Тем не менее, я получаю другие утечки памяти сообщений cfnetwork / http, но это другая история, и в данный момент я не о ней беспокоюсь.

ниже приведен пример кода, когда нажимается одна из аннотаций в mapView, котораязапускает функцию loadModel в webViewController:

- (void) mapCallOutPressed: (UIView *) sender {

NSInteger selectedIndex = sender.tag;
MyLocation *selectedObject = [_mapView.annotations objectAtIndex:selectedIndex];

MyModel *model = selectedObject.model;

NSLog(@"Model selected from mapview = %@", model.description);

// Get reference to the webview from the tabBarController (viewController's index=3)
WebViewController *webViewController = [self.tabBarController.viewControllers objectAtIndex:3];
webViewController.model = model;

[webViewController loadModel];

    // Switch tabs to the webView
self.tabBarController.selectedIndex = 3;
[self.tabBarController.selectedViewController viewDidAppear:YES];

ниже - мой webViewController.h & .m:

WebViewController.h:

WebViewController : UIViewController <UIWebViewDelegate> {

UIWebView *webView;
NSString *templateRunFilePath;
MyModel *model;
NSString *templateRunTitle;

@property (nonatomic, retain) UIWebView *webView;
@property (assign) MyModel *model;
@property (nonatomic, copy) NSString *templateRunFilePath;
@property (nonatomic, copy) NSString *templateRunTitle;

-(void) loadModel;

WebViewController.m:

- (void) viewDidLoad {
[super viewDidLoad];
NSLog(@"in webview did load");

self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
self.webView.delegate = self;

self.webView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
self.webView.scalesPageToFit = YES;

[self.view addSubview:self.webView];

}


- (void) viewWillAppear:(BOOL)animated {

if (self.model) {        
    self.tabBarController.navigationItem.title = [NSString stringWithFormat: @"%@ - %@", self.tabBarController.navigationItem.title, self.model.description];

}
else {
    UIAlertView *msg = [[UIAlertView alloc] initWithTitle:@"No Model Selected" 
                                                  message:@"Please select a model from the map or list tab to view." 
                                                 delegate:nil 
                                        cancelButtonTitle:@"OK" 
                                        otherButtonTitles:nil];
    [msg show];
    [msg release];
}
}

- (void) loadModel {

NSString *localURLPath = [NSString stringWithFormat:@"%@/%@/%@", self.templateRunFilePath, self.model.folderName, self.model.modelFileName];

NSURL *url = [NSURL fileURLWithPath:localURLPath];
NSURLRequest *requestObj = [NSURLRequest requestWithURL: url];
[self.webView loadRequest:requestObj];
}


- (void)webViewDidFinishLoad:(UIWebView *)webView {   

[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
}


-(void)viewWillDisappear:(BOOL)animated {
NSLog(@"webview view will disappear");

[super viewWillDisappear:animated];

//[self.webView loadRequest:nil];
//[self.webView loadHTMLString:@"" baseURL:nil];

 self.webView.delegate = nil;
 }


- (void)dealloc {
    self.webView.delegate = nil;
[self.webView release];

[super dealloc];
}

Если у вас есть какие-либо советы или исправления, я был бы очень признателен.У меня есть <1 неделя, чтобы понять это, и я очень признателен вам, если вы дадите мне какое-либо понимание. </p>

спасибо!

-Майк

1 Ответ

0 голосов
/ 21 апреля 2011

Майк, я не уверен, что ты следуешь намеренно или по ошибке?

- (void) loadModel {

[self.webView loadHTMLString:@"" baseURL:nil]; // here you are loading... or you have tried with commenting it also?

NSString *localURLPath = [NSString stringWithFormat:@"%@/%@/%@", self.templateRunFilePath, self.model.folderName, self.model.modelFileName];

NSURL *url = [NSURL fileURLWithPath:localURLPath];
NSURLRequest *requestObj = [NSURLRequest requestWithURL: url];
[self.webView loadRequest:requestObj];   // again here you are also loading?
} 
...