2013-03-16 3 views
0

Я показываю данные в виде таблицы с использованием NSFetchedResultsController. Теперь, когда данные поступают с сервера, мне нужно удалить все данные, присутствующие в базе данных sqlite.Execution_BAD-ACCESS при удалении данных

Теперь, когда я удалить данные из базы данных по заданным ниже коде иногда падает (не всегда) дает эту ошибку:

Execution_BAD-ACCESS (code=2, address=0x0)

на этой линии

if (![moc save:&saveError]) { 

.h

@property (readonly, retain, nonatomic) NSManagedObjectContext *managedObjectContext; 
@property (readonly, retain, nonatomic) NSManagedObjectModel *managedObjectModel; 
@property (readonly, retain, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; 

.m

@synthesize managedObjectContext = _managedObjectContext; 
@synthesize managedObjectModel = _managedObjectModel; 
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator; 

NSManagedObjectContext *moc = [delegate managedObjectContext]; 

NSFetchRequest * allCategories = [[NSFetchRequest alloc] init]; 
[allCategories setEntity:[NSEntityDescription entityForName:@"Categories" inManagedObjectContext:moc]]; 
[allCategories setIncludesPropertyValues:NO]; //only fetch the managedObjectID 

NSError * error = nil; 
NSArray * dataArray = [moc executeFetchRequest:allCategories error:&error]; 

//error handling goes here 

[NSFetchedResultsController deleteCacheWithName:@"RootDetail"]; 

for (Categories *cat in dataArray) { 
    [moc deleteObject:cat]; 
} 

NSError *saveError = nil;  
if (![moc save:&saveError]) { 
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
} 

[allCategories release]; 

проверяет тщательно теперь я обнаружил, что эта проблема приходит, когда я Вист на DetailPageController и вернуться (используя UINavigationController popNavigationController :), а затем, если я не знал DetailPageController то он выходит из строя.

дает следующие errror - [DetailPageController controllerWillChangeContent]: сообщение, отправленное высвобождены например 0x11f52a90 *


Проблема состоит в NSManageObjectContext. Таким образом, исправление всегда использует новый созданный объект NSManageObjectContext, иначе он создаст проблемы.


+0

Выполнение плохого доступа обычно означает, что объект был освобожден досрочно. Как ваше свойство moc определено в вашем делете приложения? – occulus

+0

Проверьте сейчас, пожалуйста, –

+0

Немного поздно, но добавив свои 2центы. Убедитесь, что делегат для контроллера результата выборки вернулся к нулю в методе dealloc вашего uiviewcontroller. – user281300

ответ

2

Основываясь на ваш комментарий

I am using operation queue. so i enter data on main thread. 2. you are saying that each thread should have separated instance of context. But i think there should be only one main instance of context.

Нет. Вы MUST следовать документации о Concurrency with Core Data

Create a separate managed object context for each thread and share a single persistent store coordinator. This is the typically-recommended approach.

или

Create a separate managed object context and persistent store coordinator for each thread. This approach provides for greater concurrency at the expense of greater complexity (particularly if you need to communicate changes between different contexts) and increased memory usage.

или

использовать новый Core Data API.

Оригинальный вопрос

Если вы предоставите некоторые другие подробности об аварии, я думаю, мы можем помочь вам. Как насчет delegate?

А пока некоторые подсказки для вас.

1) Включить зомби в Xcode

How to enable NSZombie in Xcode?

2) Используйте правильный контекст

Почему вы используете следующий?

NSManagedObjectContext *moc = [delegate managedObjectContext];

просто использовать

NSManagedObjectContext *moc = [self managedObjectContext]; 

Это может быть происхождение проблемы. Но без подробностей я не очень уверен.

Итак, создав этот контроллер извне, задайте свойство контекста управляемого объекта правильно.

yourController.managedObjectContext = theContextYouWantToShare; 

3) обработка

NSError * error = nil; 
NSArray * dataArray = [moc executeFetchRequest:allCategories error:&error]; 
if(dataArray) { 
    // manage objects here... 
} else { 
    // handle error here... 
} 
+0

будет только один экземпляр NSManageObjectContext в приложении. поэтому, если я получаю его от делегата или setIt в контроллере представления во время инициализации, тогда он может создать любую проблему. –

+0

, когда я включаю NSZombie, тогда появляется ошибка. Теперь приложение не загрузит панель управления, и она сбой при втором посещении экрана не первой. *** - [DetailPageController controllerWillChangeContent:]: сообщение отправлено на освобожденный экземпляр 0x11f52a90 –

+0

Я исправил проблему после активации NSZombie. спасибо –

0

Ответ на flexaddicted очень хорошо (к сожалению, пока не могу комментировать), но помню, чтобы быть очень осторожным, если у вас есть многопоточное приложение Error (вы упоминаете серверные вызовы в своем вопросе). Убедитесь, что каждый поток использует свой собственный контекст, иначе вы столкнетесь с проблемами. Это хорошо документировано в документации Apple Core Data.

Или, по крайней мере, убедитесь, что любой вызов сделать что-то с основными данными находится в основном потоке (хотя это не идеально, поскольку это может блокироваться при выполнении длительных операций).

+0

1. Я использую очередь операций. поэтому я ввожу данные в основной поток. 2. Вы говорите, что каждый поток должен иметь отдельный экземпляр контекста. Но я думаю, что должен быть только один основной пример контекста. –

+0

Чтобы проверить, в какой поток выполняются операции с основными данными, вы можете добавить [NSThread isMainThread] при вызове операций с основными данными. Документы Apple содержат дополнительную информацию: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/CoreData/Articles/cdConcurrency.html. В этой ссылке он говорит: «Шаблон, рекомендуемый для параллельного программирования с Core Data, - это ограничение потока: каждый поток должен иметь свой собственный полностью закрытый управляемый объект. Но я не знаю, если это проблема. Попробуйте проверить, в какой поток вы вызываете операции coredata, и попробуйте предложения из flexaddicted. – miwic

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