Как предотвратить утечку приложения EXC_BAD_ACCESS?

Есть ли способ предотвратить сбой приложения EXC_BAD_ACCESS, например, с помощью @[email protected], вы можете обработать исключение изящно.

Update:

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

Ответ 1

В ObjC try/catch не обрабатывают исключения, особенно изящно. Вы по-прежнему будете терять память и оставить систему в состоянии undefined. За редким исключением, вы ожидаете, что вы просто поймаете, чтобы вы могли записывать некоторые вещи перед сбоем. И вообще, вы не должны использовать @catch где угодно, но на верхнем уровне своей программы для этой цели. Существуют некоторые чрезвычайные ситуации, когда ограниченное использование исключений может быть уместным, но они встречаются редко в ObjC. Дополнительную информацию см. В Руководство по программированию исключений. См. Особенно следующее из Документация ObjC ARC:

Стандартное соглашение Cocoa - это ошибка программиста с ошибками исключения и не предназначена для восстановления. Предоставление исключений для исключений из кода по умолчанию налагало бы серьезные ограничения времени исполнения и размера кода на код, который обычно не заботится об безопасности исключений. Поэтому код, созданный с помощью ARC, по умолчанию исключает исключения, что очень хорошо, если процесс будет немедленно прекращен. Программы, которые заботятся о восстановлении из-за исключения, должны включать опцию [-fobjc-arc-exceptions, которая налагает ограничения скорости и памяти на вашу программу].

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

Ответ 2

Вы часто получаете EXC_BAD_ACCESS, потому что вы отправили сообщение выпущенному объекту. Затем вы можете проверить NSZombie. Что такое NSZombie? Вы можете увидеть: . Он поймает EXC_BAD_ACCESS из-за отправки сообщения выпущенному объекту.

Вы можете установить NSZombie следующим образом: Проверьте Enable Zombie Objects enter image description here

И вы также можете получить EXC_BAD_ACCESS, потому что уровень предупреждений памяти слишком высок, или ваша память слишком высока, поэтому Apple закроет ваше приложение. Этот EXC_BAD_ACCESS слишком сложно предотвратить. Я думаю, что единственный способ - как можно меньше управлять своей памятью, иногда вы можете увидеть журнал, где receive memory warning, когда уровень высокий, он может получить EXC_BAD_ACCESS

Ответ 3

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