Сбой UIWebView EXC_BAD_ACCESS

Это побитовый оператор xor в java, который приводит к 1 для разного значения (т. е. 1 ^ 0 = 1) и 0 для одного значения (т. е. 0 ^ 0 = 0).

29
задан Jim Puls 12 August 2009 в 07:32
поделиться

6 ответов

Попробуйте включить NSZombie и посмотрите, будет ли что-то выпущено слишком рано.

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

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

9
ответ дан bbum 12 August 2009 в 07:32
поделиться

Просмотр исчезнет - это рабочий вариант принятого ответа:

// ARC
- (void)viewWillDisappear:(BOOL)animated{
    [self.webView setDelegate:nil];
    [self.webView stopLoading];
}

Это прекрасно работает для iOS 6.

5
ответ дан jturolla 12 August 2009 в 07:32
поделиться

У меня был сбой EXC_BAD_ACCESS на прокручивающемся UIWebView, но только на iPad, и только тогда, когда пользователь оставил прокрутку UIWebView, когда он / она закрыл контроллер представления, содержащий его.

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

for (id subview in webView.subviews){
        if ([[subview class] isSubclassOfClass: [UIScrollView class]]){
            [subview setContentOffset:CGPointZero animated:NO];
        }
    }

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

2
ответ дан avance 12 August 2009 в 07:32
поделиться

Вы должны прекратить загрузку 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.

86
ответ дан Ondrej 12 August 2009 в 07:32
поделиться

Я также увидел эту точную ошибку, и она была вызвана тем, что делегат, которого я назначил для UIWebView, не был сохранен (в моем случае UIViewController).

1
ответ дан AustinRathe 12 August 2009 в 07:32
поделиться

Обработка отмены регистрации делегата в веб-представлении и остановка веб-просмотра от загрузки лучше всего обрабатывается с помощью метода dealloc в ViewController.

В качестве примера того, когда viewWillDisappear может перестать работать: если ViewController является дочерним по отношению к другому ViewController, вы можете инициировать удаление представления ViewController из представления родительского ViewController с анимацией. В то же время вы можете удалить ViewController из его родителя и удалить его ссылку. В этот момент ViewController будет иметь значение nil, и viewWillDisappear никогда не будет вызываться, то есть делегат WebView никогда не будет очищен.

Используйте dealloc и убедитесь, что ваш WebView всегда очищен.

0
ответ дан Fostah 12 August 2009 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: