Отладчик останавливается при сохранении основных данных, но не выводит ошибки - PullRequest
5 голосов
/ 20 марта 2012

У меня есть простой метод, который просто берет два идентификатора управляемого объекта, извлекает для них управляемые объекты, создает отношение, а затем сохраняет их в managedObjectContext.

Когда я выполняю сохранение в managedObjectContext, отладчикостанавливается на строке сохранения с objc_exception_throw, ссылающимся на сохранение nsmanagedObjectContext.Хотя в объекте nserror нет выходных данных, чтобы дать мне какие-либо подробности относительно того, почему генерируется исключение.Также кажется, что это сохранение работает нормально, что делает это еще более запутанным.

Вот метод, о котором идет речь ...

- (void)relateLocationToInvite:(NSManagedObjectID *)locationID :(NSManagedObjectID *)inviteID {
NSManagedObject *invite = [self.managedObjectContext objectWithID:inviteID];
NSManagedObject *locationObj = [self.managedObjectContext objectWithID:locationID];
Location *location = (Location *)locationObj;

[invite setValue:location forKey:@"location"];
NSError *error = nil;
if( ![self.managedObjectContext save:&error] ){
    NSLog(@"Error relating a location to an invite %@",error);
}

}

1 Ответ

8 голосов
/ 21 марта 2012

Если выполнение приложения продолжается после метода save: без каких-либо проблем (т. Е. Без создания какого-либо необработанного исключения и без сообщения об ошибке), это означает, что реализация операции сохранения перехватила исключение и решила игнорировать его.

Почему это происходит, неясно: возможно, реализация использует исключения для сообщения о внутренних ошибках (это не тот способ, которым следует использовать исключения Objective C, но некоторые другие языки более широко используют исключения). Пока исключение перехватывается до того, как оно достигнет вашего собственного кода, вам не следует об этом беспокоиться.

Если вы хотите узнать причину исключения, вы можете включить objc_exception_throw и использовать следующую команду отладчика:

po *(id *)($ebp + 8)

Это отобразит параметр NSException *, данный функции в iOS Simulator (архитектура x86). На устройстве (архитектура arm) того же результата можно достичь, используя (если моя память работает правильно):

po $r0
...