Это побитовый оператор xor в java, который приводит к 1 для разного значения (т. е. 1 ^ 0 = 1) и 0 для одного значения (т. е. 0 ^ 0 = 0).
Попробуйте включить NSZombie и посмотрите, будет ли что-то выпущено слишком рано.
Может случиться так, что вы отменяете загрузку представления, а затем немедленно разрушаете иерархию представлений, что приводит к освобождению чего-либо до того, как UIWebView завершит работу с ним.
В этом случае обратная трассировка выглядит отчетливо, как будто это делегат, который освобождается рано. Отношения между делегатами, как правило, слабые и, не имея GC, являются замечательным источником для висячих ссылок, вызывающих сбои, которые выглядят именно так.
Просмотр исчезнет - это рабочий вариант принятого ответа:
// ARC
- (void)viewWillDisappear:(BOOL)animated{
[self.webView setDelegate:nil];
[self.webView stopLoading];
}
Это прекрасно работает для iOS 6.
У меня был сбой EXC_BAD_ACCESS на прокручивающемся UIWebView, но только на iPad, и только тогда, когда пользователь оставил прокрутку UIWebView, когда он / она закрыл контроллер представления, содержащий его.
Установка делегата на ноль не устранила мою проблему здесь, но я нашел решение в другом месте под другой проблемой. Я добавил этот код в метод, вызываемый моей кнопкой закрытия:
for (id subview in webView.subviews){
if ([[subview class] isSubclassOfClass: [UIScrollView class]]){
[subview setContentOffset:CGPointZero animated:NO];
}
}
Это останавливает прокрутку до вызова метода dealloc, что, похоже, является проблемой.
Вы должны прекратить загрузку webView и удалить делегата, прежде чем покинуть вид:
// ARC (correct solution)
- (void)dealloc {
[_webView setDelegate:nil];
[_webView stopLoading];
}
// non ARC
- (void)dealloc {
[webView setDelegate:nil];
[webView stopLoading];
[webView release];
[super dealloc];
}
// ARC (older solution)
- (void)viewWillUnload {
[webView setDelegate:nil];
[webView stopLoading];
}
Что говорит документация Apple: Важно Перед выпуском экземпляра UIWebView, для которого вы установили делегат, вы должны сначала установить его свойство делегата на ноль . Это можно сделать, например, в вашем методе dealloc.
Я также увидел эту точную ошибку, и она была вызвана тем, что делегат, которого я назначил для UIWebView, не был сохранен (в моем случае UIViewController).
Обработка отмены регистрации делегата в веб-представлении и остановка веб-просмотра от загрузки лучше всего обрабатывается с помощью метода dealloc в ViewController.
В качестве примера того, когда viewWillDisappear может перестать работать: если ViewController является дочерним по отношению к другому ViewController, вы можете инициировать удаление представления ViewController из представления родительского ViewController с анимацией. В то же время вы можете удалить ViewController из его родителя и удалить его ссылку. В этот момент ViewController будет иметь значение nil, и viewWillDisappear никогда не будет вызываться, то есть делегат WebView никогда не будет очищен.
Используйте dealloc и убедитесь, что ваш WebView всегда очищен.