Сообщение 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), и эта ошибка исправлена ​​в окончательной версии.

Спасибо за помощь в отслеживании этого! По крайней мере, я получил окончательный ответ на вопрос, почему проблема существует!