Основные сбои данных при попытке сохранить после удаления - PullRequest
4 голосов
/ 02 октября 2010

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

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

- (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!");   
    }
} 

1 Ответ

4 голосов
/ 02 октября 2010

Я предполагаю, что сбой означает - EXC_BAD_ACCESS.Если нет, пожалуйста, опубликуйте полученное вами исключение и трассировку стека.

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

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

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

Goв Project-> Edit Active Executable, перейдите на вкладку Arguments и в разделе переменных среды добавьте

NSAutoreleaseFreedObjectCheckEnabled 
NSZombieEnabled    
NSDebugEnabled 

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

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