2013-08-27 2 views
1

В моем приложении, если у меня есть представление, которое было освобождено (через modal увольнение или навигация стека pop), и после этого у меня появляется предупреждение о памяти, мое приложение падает.didreceivememorywarnings сообщение отправлено на освобожденный экземпляр

Я проверил, поставив модальный создать/отклонить очень рано в мое приложение, которое выглядит так:

WWebViewController *webViewController = [[WWebViewController alloc] initWithPath:@"http://www.google.com"]; 
     [webViewController setIsModal:YES]; 
     WMainNavController *navController = [[WMainNavController alloc] initWithRootViewController:webViewController]; 
     [self presentViewController:navController animated:YES completion:nil]; 

Веб вид довольно прост:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self setNavigationDefaultsWithTitle:@"Loading..." withBackButton:YES withSearchButton:YES deepLinked:false]; 
    webView = [[UIWebView alloc] initWithFrame:[self.view bounds]]; 
    webView.delegate = self; 
    [self.view addSubview:webView]; 
    [webView scalesPageToFit]; 
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.path]]]; 
    [self showNoConnectionImageIfNecessary:NO]; 
    // Do any additional setup after loading the view. 
} 

...

- (void)dealloc { 
    [webView loadHTMLString:@"" baseURL:nil]; 
    [webView stopLoading]; 
    [[NSURLCache sharedURLCache] removeAllCachedResponses]; 
    [webView setDelegate:nil]; 
    webView = nil; 
} 

Однако простое представление, а затем отклонение этого представления, сопровождаемое имитацией предупреждения о памяти, дает следующее:

*** -[WMainNavController retain]: message sent to deallocated instance 0xba953c0 

Я пробовал это, вызывая WWebViewController непосредственно без WMainNavController, пытался с помощью регулярного навигационный контроллер, пытался просто нажав что-то в стек нав. Он всегда сбой, если я выскочил или отклонил представление в любом месте приложения.

Я делаю что-то принципиально неправильно? Если я прохожу через приложение, не отпуская/выскакивая, он отлично справляется с предупреждениями о памяти, и перед этим будет только один экран, который представляет этот экран как модальный и является корневым представлением программы.

Я предоставлю дополнительную информацию, кто-нибудь видел что-то подобное?

Редактировать - это реализация ARC.

Edit - Вот скриншот из моих инструментов с зомби на:

enter image description here

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

+0

К сожалению, это ARC. Я отредактирую это. – Stakenborg

+0

Вы видите эту проблему, если вы вынимаете все свои дополнительные вызовы 'webView' в' dealloc'? Обычно вы не должны запускать новые асинхронные нагрузки (как 'loadHTMLString: baseURL:' делает) в середине освобождения. –

+0

Большая часть того, что находится в методе dealloc, - это материал, с которым я работал, чтобы справляться с проблемами памяти при освобождении WebView. Глупые вещи всегда пытаются повесить на память. Тем не менее, этот сбой происходит независимо от того, какой вид я увольняю/поп, не обязательно должен быть этот конкретный веб-просмотр (или веб-просмотр в любом месте, может быть любым контроллером представления). Чтобы ответить на ваш вопрос, да, это все равно, если я удалю все эти вещи в моем методе dealloc. – Stakenborg

ответ

0

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

Я по существу начал удалять любые категории/контроллеры/все, что влияет на многие или все другие основные компоненты моего приложения из источников компиляции на этапах сборки моей цели. Затем я прокомментировал код, поэтому мое приложение построило бы туда, где мне было нужно, чтобы пройти тест. В конце концов я выделил категорию UIViewController, которая «вызывала проблему», и удалила из нее все методы, а также внешнюю переменную NSString.

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

Я счастлив, что это работает сейчас, но проклятый мистифицировал, что я никогда не буду знать, почему это сломалось в первую очередь.

Смежные вопросы