катастрофический отказ iPhone Simulator с WebPreferences в списке потока

Ссылочная Библиотека Разработчика Apple имеет ссылку класса для WebPreferences

Я искал Так, Форумы Dev и Погугленный без любых релевантных результатов.

EXC_BAD_ACCESS сигнал сгенерирован.

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

Править

Это инициировано при ответвлении a UITextField, отъезд a UITextField или если a UITextField установлен как первый респондент при загрузке представления (спешите контроллером навигации).

Не легко воспроизвести. Я могу пойти для ста app-launch/debug циклов, прежде чем это произойдет снова. И затем это могло бы произойти 3 раза в 5 запусках.


У меня действительно есть список потока в отладчике, который показывает несколько ссылок на WebPreferences.

alt text

7
задан Glorfindel 21 May 2019 в 22:09
поделиться

5 ответов

Вы на правильном пути, если используете NSZombie . EXEC_BAD_ACCESS вызывается доступом к освобожденным объектам.

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

Ключевой частью использования NSZombie является запуск malloc_history в командной строке. Вы получите стек вызовов, показывающий, откуда был создан перевыпущенный объект. Например: alt text http://static.benford.name/malloc_history.png

Снимок экрана показывает падение моего приложения на [NSString stringByTrimmingCharactersInSet:], но это, конечно, не тот, кто вызвал падение.

Я использую технику, чтобы посмотреть на самый ранний путь кода, которым владеете вы . Большую часть времени ошибка лежит там.

В данном случае, объект происходил из класса [JTServiceHttpRequest requestFinished], в котором я некорректно сохранял объект.

Если все остальное не удастся, пройдите все перечисленные пути кода и проверьте правильность использования правил управления памятью.

Моя ставка на то, что поведение WebPreferences и UITextField не имеет никакого отношения к аварийному завершению.

.
1
ответ дан 7 December 2019 в 18:43
поделиться

Для любых ошибок EXC_BAD_ACCESS вы обычно пытаетесь отправить сообщение освобожденному объекту. ЛУЧШИЙ способ отследить их - использовать NSZombieEnabled .

Это работает, фактически никогда не освобождая объект, а превращая его в «зомби» и устанавливая внутри это говорит, что он обычно был бы выпущен. Таким образом, если вы попытаетесь получить к нему доступ снова, он по-прежнему будет знать, что это было до того, как вы сделали ошибку, и с этой небольшой информацией вы обычно можете вернуться назад, чтобы увидеть, в чем была проблема.

Это особенно помогает в фоновом режиме потоков, когда отладчик иногда выскакивает из любой полезной информации.

ОЧЕНЬ ВАЖНО ПРИМЕЧАНИЕ , однако, вам необходимо на 100% убедиться, что это только в вашем отладочном коде, а не в вашем коде распространения. Поскольку ничего никогда не выпускается, ваше приложение будет протекать, просачиваться и протекать. Чтобы напомнить мне об этом, я помещаю этот журнал в свой appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");

Если вам нужна помощь в поиске точной строки, выполните Build-and-Debug ( CMD-Y ) вместо Build- and-Run ( CMD-R ). Когда приложение дает сбой, отладчик покажет вам, какая именно строка, и в сочетании с NSZombieEnabled вы сможете точно выяснить, почему.

1
ответ дан 7 December 2019 в 18:43
поделиться

Тот факт, что он разбивается в _integerValueForKey: заставляет меня сильно подозревать, что он разбивается на переизданном NSNumber. Перевыпуск NSNumber может привести к таким странным сбоям, что это почти юмористично. Вот что происходит:

  • Вы создаете NSNumber для целого числа "2"
  • Класс NSNumber кэширует NSNumber
  • Вы переотпустите его
  • Кэш класса NSNumber теперь указывает на плохую память
  • Какой-то совершенно несвязанный кусок кода создает NSNumber для целого числа "2"
  • Класс NSNumber ищет его в кэше и.....
  • Bang

Если вы используете Snow Leopard, нажмите Cmd-Shift-A, чтобы дать анализатору возможность поискать проблемы с управлением памятью. В противном случае, отправляйтесь на охоту в использовании NSNumbers.

0
ответ дан 7 December 2019 в 18:43
поделиться

согласились с предыдущими респондентами о Nszombie. Чаще всего эта штука происходит, когда вы используете свой класс в качестве делегата UITEXTVIEW (или любого другого класса), а также обратитесь в переменную Iboutlet. Когда вы оставляете свой ViewController - он стал оформленным. Но если вы не выпустили переменную IBOutlet In - (void) DEALOC-метод - UItextView все равно отправят вызовы для выпущенного делегата (контроллер вашего представления).

0
ответ дан 7 December 2019 в 18:43
поделиться

Больше похоже на ошибку авто-релиза. Возможно, вы выпускаете что-то, что вам не "принадлежит", а пул NSAutoRelease запущен и пытаетесь очистить что-то, что уже было выпущено?

Вы выпустили что-то, что вы не "выделили"? Например, вы бы не сделали:

NSString *test = @"testing";
[test release];

Так как это приведет к краху, когда запустится пул Auto Release и попытаются выпустить NSString.

0
ответ дан 7 December 2019 в 18:43
поделиться
Другие вопросы по тегам:

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