Сохранение NSManagedObjectContext не приводит к сбою, а прерывается на objc_exception_throw - PullRequest
6 голосов
/ 10 августа 2011

У меня та же проблема, описанная по этому адресу http://www.cocoabuilder.com/archive/cocoa/288659-iphone-nsmanagedobjectcontext-save-doesn-crash-but-breaks-on-objc-exception-throw.html

Я отлаживаю приложение, которое использует Core Data с многопоточностью, и у меня есть точка останова на objc_exception_throw, и она достигает этой точки останова при вызовеспасти.(строка 2 в коде)

        NSError *error = nil;
        [self.managedObjectContext save:&error];
        if (error) {
            NSLog(@"Error : %@",error);
        }

У меня нет ни одной записи в журнале.Я использую Xcode 4 с IOS 4.0 -> 4.3.Я думаю, что это не связано с версией Xcode / iOS.

Ответы [ 5 ]

7 голосов
/ 05 ноября 2012

Глядя на этот ответ , вы обнаруживаете, что CoreData внутренне использует исключения для управления потоком своих программ. Вот почему отладчик ломается в objc_exception_throw. Насколько я знаю, это невозможно отключить.

РЕДАКТИРОВАТЬ: С тех пор существует решение игнорировать эти исключения: Игнорировать определенные исключения при использовании точки останова Все исключения Xcode

Кстати: не проверяйте error, но используйте возвращенное значение BOOL, чтобы гарантировать успешность вашего вызова сохранения. Правильный способ сделать это будет:

NSError *error = nil;
BOOL success = [self.managedObjectContext save:&error];
if (!success) {
    NSLog(@"Error : %@",error);
}
4 голосов
/ 10 августа 2011
  • Во-первых, при использовании многопоточности с CoreData у меня было мало проблем, когда прохождение NSManagedObject вокруг приложения. Вместо этого, как задокументировано Apple, я заканчиваю тем, что передаю NSManagedObjectID и реконструирую полный объект.
  • Во-вторых, когда у вас ничего не зарегистрировано, это, вероятно, связано с проблемы с памятью, попробуйте запустить профилировщик особенно, но не только, ища "Зомби", это должен сказать вам больше.
  • Наконец, убедитесь, что вы правильно инициализировали контекст, у меня было похожая проблема, потому что модель из файла momd не была найдена и не загружен.
1 голос
/ 09 ноября 2015

Недавно я столкнулся с той же проблемой: сбой приложения без какого-либо журнала при попытке сохранить managedObjectContext.

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

Это (по-видимому) также приведет к уничтожению стека Core Date без каких-либо видимых ошибок в коде или журнале.

Оказалось, у меня были несохраненные изменения, которые заставили менеджер БД заблокировать хранилище. Закрытие менеджера БД исправило проблему. Простая и глупая ошибка, но мне потребовались часы, чтобы выяснить.

1 голос
/ 25 февраля 2012

У меня была похожая проблема, в конечном итоге она возникла из-за наблюдателя NSManagedObjectContextDidSaveNotification , который был освобожден без удаления из центра уведомлений. Кажется, что исключение CoreData «скрывает» неизвестное исключение селектора, которое возникает, когда центр уведомлений пытается уведомить любой объект, занимающий память, освобожденную зарегистрированным (но освобожденным) наблюдателем.

0 голосов
/ 30 апреля 2012

Мне довелось столкнуться с этой проблемой, и после долгой отладки я обнаружил, что это из-за дублирования объявления ошибки NSError *, возможно, у вас возникла другая ошибка NSError * во внешней области, например:

NSError* error = nil;

Какой-то код

if (!error)
{
    NSError* error = nil;
    // your code
}

Тогда ошибка будет равна нулю, хотя на самом деле есть исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...