Сбой UIWebView только при второй загрузке - PullRequest
1 голос
/ 17 декабря 2010

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

Вот поток программы, который наконец загружает WebView.

У меня есть табличное представление, в котором перечислены видео. При щелчке строки загружается подробный вид с дополнительной информацией. о видео. После загрузки подробного представления, если пользователь нажимает кнопку Воспроизвести, загружается другое представление с WebView.

В этом представлении в viewDidLoad NSURLRequest создается и передается в WebView loadRequest.

WebView загружается нормально и отображает веб-страницу с нужным мне видео. Все это находится на контроллере навигации, поэтому пользователь может нажать кнопку «Назад» и вернуться к предыдущему подробному виду.

Я освобождаю WebView в dealloc, а также прекращаю его загрузку, если он все еще делал это. WebView получается через IBOutlet и синтезируется как (неатомный, сохраняемый).

У меня есть NSZombiesEnabled, и я не видел там никаких проблем. Так, когда это терпит крах? Если пользователь нажимает кнопку «Воспроизвести» второй раз, просмотр видео создается снова и в [webView loadRequest] - я получаю EXC_BAD_ACCESS после загрузки страницы.

Вот кикер, хотя, если я вернусь к Таблице и выберу другую строку (видео), то я могу загрузить этот WebView без каких-либо проблем. Только если я дважды загружаю одно и то же видео, оно падает.

Вид, содержащий веб-представление, освобождается после его создания и нажатия на навигационную панель. контроллер. Я установил тонну точек останова - все (при второй загрузке) хорошо до тех пор, пока не будет вызван webViewDidFinishLoad, что бы ни случилось после этого, это вызывает сбой. Я не получаю трассировку стека (или не знаю, как ее найти):)

Спасибо!

Вот код из представления WebView - некоторые из них основаны на выводах других людей о проблемах памяти с UIWebView.

 - (void)viewDidLoad {

[super viewDidLoad];
self.title = @"Video Player";

NSURL *url = [NSURL URLWithString:video.url];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView loadRequest:request];  

}


- (void)viewDidUnload {
[super viewDidUnload];
[webView setDelegate:nil];
[self setWebView:nil];
}


- (void)dealloc {
[video release];
[super dealloc];
}

1 Ответ

3 голосов
/ 17 декабря 2010

РЕДАКТИРОВАТЬ - Если вы не хотите читать все комментарии, вот что происходит:

Контент исходил из вашей трубки - использование другого URL-адреса устраняло сбой: (* ​​1003 *


Привет

1) Что такое все звонки [self retain] и [self release]? Вам не нужно ни одного из них - если вы это сделаете, вы скрываете ошибку где-то еще в вашем коде.

2) Это выглядит неправильно -

[webView stopLoading];
if ([webView isLoading])
    [webView stopLoading];

если вы должны это исправить, то есть ошибка где-то еще - если вызов stopLoading не работает, то повторный вызов не поможет!

3) Весь ваш метод loadRequest может быть просто [webView loadRequest:request]; - вы можете с уверенностью предположить, что если вы скажете веб-представлению загрузить что-то, оно прекратит загрузку чего-либо еще.

4) Я поставил [super viewDidLoad]; в начале, а не в конце моей функции viewDidLoad - вы не знаете, что еще он настраивает, что вам может понадобиться (хотя это может также ничего не делать - я просто пытаюсь воспроизвести его безопасный) 5) Что такое объявление свойства в вашем файле .h для webView (его следует сохранить) (при условии, что оно создано как IBOutlet из файла xib)

6) В вашем viewDidUnload вам нужно удалить свое веб-представление - установите его делегат равным nil и вызовите [self setWebView:nil];, иначе вы можете его утечь. (Предполагается, что он создан как IBOutlet из файла XIB)

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

...