Сообщение EXC_BAD_ACCESS отправлено на освобожденный экземпляр, но я использую ARC?
У меня есть приложение, которое получает информацию из веб-службы SOAP, и я хочу отображать результаты в UITableView
.
У меня была предыдущая версия этого приложения, и я создаю новую версию, чтобы в основном очистить вещи и избавиться от кучи устаревшего кода, который устарел и больше не используется.
В предыдущей версии это сработало хорошо. В новой версии не так много.
В основном, текущий сценарий возвращает 3 строки, которые я пытаюсь использовать в качестве основы для данных в моем UITableView
.
Я борюсь с этой проблемой, потому что так сильно не удается отследить ошибки EXC_BAD_ACCESS
!
(Скорее, если у кого-то есть способ сделать отладочный опыт более похожим на Visual Studio, я бы хотел его услышать! Это так расстраивает, что у меня нет идеи, какая строка вызвала ошибку, а также не сможет просмотрите мои локальные переменные во время сбоя, чтобы узнать, что. Я уже добавил в контрольную точку исключения, но это, похоже, мало что делает.)
В любом случае, строка, вызывающая ошибку APPEARS, будет:
return [[self Libraries] count];
Это происходит в tableView:numberOfRowsInSection:
.
Сообщение об ошибке Я получаю APPEARS для ссылки на строку, которая должна быть сохранена в NSMutableArray
[self Libraries]
.
Что здесь происходит?
Я использую ARC, так что не все управление моей памятью должно быть правильно обработано?
У меня нет каких-либо инструкций по ручному выпуску в моем коде ANYWHERE!
Пожалуйста, помогите мне исправить это!
Ответы
Ответ 1
Установите NSZombieEnabled, MallocStackLogging, и guard malloc в отладчике. Затем, когда ваше приложение выйдет из строя, введите его в консоли gdb:
(gdb) info malloc-history 0x543216
Замените 0x543216
адресом объекта, который вызвал сбой, и вы получите гораздо более полезную трассировку стека, и это поможет вам точно определить точную строку в коде, вызывающую проблему.
Подробнее см. в этой статье.
Ответ 2
ARC опирается на стандартную/рекомендуемую технологию именования Apple. Убедитесь, что вы не нарушаете их.
Только для стартеров, если "Libraries
" является экземпляром, существуют проблемы с именами.
Ответ 3
Хорошо, так что я чувствую себя немного глупо, но у меня есть две производственные машины. На одном из них я установил копию Xcode 4.2 beta вместе с финальной, производственной копией. Я забыл удалить бета-версию и использовал ее для запуска моего кода. Как только я очистил это и проверил свой код против финального, выпущенного Xcode 4.2, все снова отлично работает.
Как я уже говорил выше, Джонатан Гринспан, я понимаю управление памятью Obj-C. По какой-то причине я получал удержание/выпуск/выпуск (выполняемый ARC), и эта ошибка исправлена в окончательной версии.
Спасибо за помощь в отслеживании этого! По крайней мере, я получил окончательный ответ на вопрос, почему проблема существует!