Сбой приложения Core Data, EXC_BAD_ACCESS и NSZombie

В настоящее время я работаю над приложением, которое сильно зависит от Core Data. Я использую навигационный контроллер для перемещения и всплывающих окон. Когда я возвращаюсь в стек в навигационном контроллере, программа иногда дает сбой, и я получаю сообщение об ошибке (обычно выделенное при синтезе или удалении управляемого контекста):

"Thread 1: Program received signal: "EXC_BAD_ACCESS".

Я использовал статический анализатор, чтобы исправить все найденные утечки.

Я использовал NSZombie, и кажется, что мои ассигнования увеличиваются, а затем не уменьшаются, когда я отключаю представления меню. Затем, когда я нажимаю на другое представление меню, я получаю два результата.

0 Category:NSManagedObjectContext EventType:Malloc RefCt:1 Timestamp:00:04.133.722 Address:0x5da0f10 Size:128 RespLib:pua-app RespCaller:-[pua_appAppDelegate managedObjectContext]

1 Category:NSManagedObjectContext EventType:Zombie RefCt:-1 Timestamp:00:16.524.983 Address:0x5da0f10 Size:0 RespLib:pua-app RespCaller:-[OpenersroutinesMenuViewController setManagedObjectContext]

У меня НУЛЕВОЙ опыт работы с этим типом отладки, но, по-видимому, контекст управляемого объекта «несчастлив», и я предполагаю, что я неправильно создаю или управляю контекстом, поскольку он передается через меню. Это интересно еще и потому, что в этих меню MOC не изменяется, а в представлениях, где он изменяется, этой ошибки не возникает.


person HappySlice    schedule 20.05.2011    source источник
comment
Обязательно добавьте ответ к своему решению, чтобы другие могли извлечь из него уроки и, что, возможно, более важно, никто другой не будет пытаться ответить на него. :)   -  person Matthew Frederick    schedule 21.05.2011


Ответы (1)


Во-первых, утечки никогда не вызовут такой аварии. Утечка — это недовыпуск. Эти сбои обычно вызваны чрезмерным выпуском.

Судя по вашему NSZombie выводу, похоже, что ваш MOC перевыпущен. Я бы посмотрел на каждое место, где вы обрабатываете manageObjectContext, и убедился, что вы сохраняете и освобождаете его правильно. Первое правило — использовать аксессоры, а не возиться с вашими иварами напрямую (за исключением -init, -dealloc и ваших аксессоров, которые должны использовать ивары).

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

Проблема, вероятно, не имеет ничего общего с представлениями или меню. Проблема, скорее всего, в том, что вы вызываете -release на MOC, который вы не сохранили.

person Rob Napier    schedule 20.05.2011