0

У меня есть приложение с двумя вкладками. В первом я создаю объекты объектов «Sample» и «SampleList». Каждый sampleList содержит идентификатор и набор выборок. Каждый образец содержит свойство даты и температуры.CoreData: при сбое приложения при удалении последнего экземпляра

Во второй вкладке я показываю свои данные в таблицеView. Я реализовал метод

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

, чтобы удалить SampleLists. В моем xcdatamodel правило удаления для моей связи между SampleList и Sample - Cascade.

Моя проблема заключается в том, что когда я пытаюсь удалить SampleList, который я только что создал, приложение выходит из строя, и я получаю сигнал EXC_BAD_ACCESS. Если я перезапущу его, тогда я смогу удалить «старый» образец списка без каких-либо проблем.

Раньше у меня была следующая проблема: я не смог отобразить образцы, созданные мной с момента запуска приложения, потому что он тоже разбился. Я получил также сигнал EXC_BAD_ACCESS. На самом деле казалось, что дата последнего образца, созданного из набора, была nil. Если я не выпущу NSDate, который я использую, чтобы установить дату выборки, у меня больше нет этой проблемы ...

Если кто-нибудь может помочь мне узнать, что может вызвать проблемы, было бы здорово! !

Вот метод я использую для создания новых экземпляров:

SampleList *newSampleList = (SampleList *)[NSEntityDescription insertNewObjectForEntityForName:@"SampleList" inManagedObjectContext:managedObjectContext]; 
[newSampleList setPatchID:patchID]; 
NSMutableSet *newSampleSet = [[NSMutableSet alloc] init]; 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

for (int i = 0; i < [byteArray count]; i=i+4, sampleCount++) { 
    NSDateComponents *comps = [[NSDateComponents alloc] init]; 
    [comps setYear:year]; 
    [comps setMonth:month]; 
    [comps setDay:day]; 
    [comps setHour:hours]; 
    [comps setMinute:minutes]; 
    NSDate *sampleDate = [gregorian dateFromComponents:comps]; 

    Sample *newSample = (Sample *)[NSEntityDescription insertNewObjectForEntityForName:@"Sample" inManagedObjectContext:managedObjectContext]; 

    [newSample setSampleDate:sampleDate]; 
    [newSample setSampleTemperature:[NSNumber numberWithInt:temperature]]; 

    [newSampleSet addObject:newSample]; 
    [comps release]; 
    //[sampleDate release]; 
} 

[newSampleList setSampleSet:newSampleSet]; 
// [newSampleSet release]; 

NSError *error; 
if (![managedObjectContext save:&error]) { 
    NSLog(@"Could not Save the context !!"); 
} 

[gregorian release]; 

редактировать: Я нашел ошибку. я делал comparaison для каждого sampleDate так:

NSDate *maxDate = [[NSDate alloc] initWithTimeIntervalSinceReferenceDate:0]; 
(...) 
for (int i = 0; i < [byteArray count]; i=i+4, sampleCount++) { 
    (...) 
    if ([maxDate compare:sampleDate] == NSOrdredAscending){ 
     max = sampleDate; 
    } 

Где я должен был делать:

if ([maxDate compare:sampleDate] == NSOrdredAscending){ 
    [maxDate release]; 
    maxDate = [sampleDate retain]; 
} 

ответ

1

Согласно документации NSEntityDescription,

+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context 

возвращает autoreleased объект. Так что вам не нужно, чтобы освободить его после того, как:

[newSampleList setSampleSet:newSampleSet]; 

newSampleList будет autoreleased в конце концов, что является причиной того, что вы видите, как иногда получать EXC_BAD_ACCESS при перезагрузке приложения.

Apple's memory management documentation предоставит вам лучшие практики, когда вам нужно освободить объект самостоятельно и когда объекты будут автореализованы.

+0

newSampleSet был создан с помощью alloc + init, а затем снова сохранен с помощью newSampleList, поэтому вам нужно будет сделать [release новогоSampleSet], чтобы сбалансировать alloc + init. Когда newSampleList будет автореализован, он также выпустит newSampleSet. – pxl

+0

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

+0

Таким образом, ссылка на документацию по управлению памятью была полезна! Спасибо – leochab

0

Мне нравится использовать метод как следующий, чтобы получить более информативные ошибки Core Data Докладываю:

- (void) detailedStoreError:(NSError *)error { 
    NSLog(@"Failed to save to data store: %@", [error localizedDescription]); 
    NSArray *_detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 
    if (_detailedErrors != nil && [_detailedErrors count] > 0) { 
     for (NSError *_detailedError in _detailedErrors) { 
      NSLog(@" DetailedError: %@", [_detailedError userInfo]); 
     } 
    } 
    else { 
     NSLog(@" %@", [error userInfo]); 
    } 
} 

Вы можете использовать его следующим образом:

NSError *error; 
if (![managedObjectContext save:&error]) { 
    [self detailedStoreError:error]; 
} 

Более информативный отчет об ошибках может помочь вам устранить неполадки.

+0

Спасибо за советы, но у меня нет ошибок при сохранении контекста. Но время от времени я сделаю так! – leochab

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