Сообщение EXC_BAD_ACCESS отправлено освобожденному экземпляру, но я использую ARC? - PullRequest
10 голосов
/ 29 октября 2011

У меня есть приложение, которое получает информацию от веб-службы SOAP, и я хочу отобразить результаты в UITableView.

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

В предыдущей версии это работало хорошо. В новой версии не так уж и много.

По сути, текущий сценарий возвращает 3 строки, которые я пытаюсь использовать в качестве основы для данных в моем UITableView.

Я борюсь с этой проблемой, потому что так трудно отследить EXC_BAD_ACCESS ошибок!

(В скобках, если у кого-то есть способ сделать процесс отладки более похожим на Visual Studio, я бы с удовольствием его услышал! Очень расстраивает отсутствие представления о том, какая строка вызвала ошибку, а также невозможность Посмотрите мои локальные переменные во время сбоя, чтобы увидеть, что к чему. Я уже добавил в точку останова исключения, но это, похоже, не очень.)

В любом случае, строка, вызывающая ошибку, выглядит так:

return [[self Libraries] count];

Встречается в tableView:numberOfRowsInSection:.

Я получаю сообщение об ошибке APPEARS для ссылки на строку, которая должна храниться в NSMutableArray [self Libraries].

Что здесь происходит?
Я использую ARC , поэтому не следует ли правильно обрабатывать все управление моей памятью?
У меня нет каких-либо ручных инструкций по выпуску в моем коде где-либо!

Пожалуйста, помогите мне исправить это!

Ответы [ 3 ]

23 голосов
/ 29 октября 2011

Установить NSZombieEnabled , MallocStackLogging и guard malloc в отладчике.Затем, когда произойдет сбой вашего приложения, введите его в консоли gdb:

(gdb) info malloc-history 0x543216

Замените 0x543216 адресом объекта, вызвавшего сбой, и вы получите гораздо более полезную трассировку стека, и этодолжно помочь вам точно определить строку кода, которая вызывает проблему.

См. эту статью для получения более подробных инструкций.

2 голосов
/ 29 октября 2011

ARC опирается на стандартную / рекомендованную практику именования Apple. Убедитесь, что вы не нарушаете ни одного из них.

Просто для начала, если "Libraries" является экземпляром, есть проблемы с именами.

1 голос
/ 30 октября 2011

ОК, я чувствую себя немного глупо, но у меня есть две машины.На одном из них я установил копию бета-версии Xcode 4.2 вместе с окончательной рабочей версией.Я забыл удалить бета-копию и использовал ее для запуска своего кода.Как только я прояснил это и запустил свой код в финальной версии Xcode 4.2, все снова работает нормально.

Как я упоминал выше Джонатану Гринспану, я действительно понимаю управление памятью Obj-C.По какой-то причине я получил retain / release / release (выполненный ARC), и эта ошибка была исправлена ​​в финальной версии.

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

...