2010-10-02 2 views
4

У меня возникли проблемы с контекстом в Core Data, который не удалось сохранить.Сбой основных данных при попытке сохранить после удаления

Я получаю случайные сбои при попытке вызвать [контекстное сохранение:]. Иногда это работает, иногда это не так и приводит к сбою приложения. Вот мой код удаления. Я смог уменьшить количество сбоев, проверяя, сохраняется ли [context responseSoSelector]. Странно, что это даже тогда, когда он терпит неудачу (отвечаетSoSelector не удается), и я не вызывал save, он по-прежнему удаляется !? Но также, когда responseSoSelector преуспевает, и я пытаюсь вызвать save, он по-прежнему иногда сбой. Таким образом, код является немного более стабильным с тестом, но я думаю, что что-то не так с Core Data и методом save. Было очень сложно отследить проблему, потому что это действительно кажется случайным.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     // Delete the managed object. 
     NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext]; 
     Accidents* accidentDelete = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
     [context deleteObject:accidentDelete]; 

     // Causing crash... 
     NSError *error = nil; 

     if ([context respondsToSelector:@selector(save:)]) 
      if (![context save:&error]) { 
       // Update to handle the error appropriately. 
       NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
       exit(-1); // Fail 
      } 
     else 
      NSLog(@"Error! Context does not respond to save!"); 
    } 
} 

ответ

3

Я предполагаю, что авария означает - EXC_BAD_ACCESS. Если нет, отправьте исключение, которое вы получаете, и трассировку стека.

EXC_BAD_ACCESS происходит потому, что вы получаете доступ к плохой памяти. Обычно это происходит из-за того, что вы получаете доступ к свободной памяти. Самый простой способ отслеживать это - включить зомби - это делает все deallocs ничего не делать, но когда вы обращаетесь к объекту, на который он вызвал dealloc, он будет жаловаться на консоль, точную точку, в которой вы находитесь освобожденный объект.

Я объясняю намного больше о EXC_BAD_ACCESS здесь, с некоторыми инструкциями по устранению неисправностей (и инструкции для включения зомби)

http://www.loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html

Перейти к Project> Edit Активный исполняемый файл, перейдите на вкладку Arguments и в разделе переменных окружения добавить

NSAutoreleaseFreedObjectCheckEnabled 
NSZombieEnabled  
NSDebugEnabled 

И установите для каждого из них значение YES. Вы можете оставить их там без отметки, но если вы их проверите, ваше приложение теперь проведет дополнительную проверку на авторекламу и выпуске и даст вам хорошую трассировку стека, когда вы это сделаете неправильно. Общая проблема заключается в том, чтобы подумать, что вам нужно вызвать release, когда объект уже настроен на автозапуск (см. Вчерашнее сообщение о том, что для этого правила).

+0

Я не получал плохой доступ, но вместо SIG-BIT. Но ваш намек на добавление переменных окружения - это то, что мне нужно, чтобы понять, почему он рушится. По какой-то причине я выслал объект даты слишком рано, а затем обратился к нему. Когда Core Data пошли на его сохранение, его больше не было и разбился. Я решил это, сделав объект даты объектом автоматического выпуска [NSDate date]. Кажется, теперь это работает. После включения переменной окружения я получил сообщение консоли, в котором сообщалось, что я отправлял сообщение в объект даты, который был выпущен, что было намеком, в котором я нуждался. –

Смежные вопросы