У меня есть приложение с двумя вкладками. В первом я создаю объекты объектов «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];
}
newSampleSet был создан с помощью alloc + init, а затем снова сохранен с помощью newSampleList, поэтому вам нужно будет сделать [release новогоSampleSet], чтобы сбалансировать alloc + init. Когда newSampleList будет автореализован, он также выпустит newSampleSet. – pxl
Я делаю что-то неправильно в управлении памятью. Я смотрю на документацию, которую вы указали. Я делаю что-то неправильно с NSDate. Действительно, я пытался удалить все о датах в моем коде (и xcdatamodel), и мое приложение больше не сбой. Я рассмотрю эти даты и управление памятью. – leochab
Таким образом, ссылка на документацию по управлению памятью была полезна! Спасибо – leochab