0

J'ai une application 2 onglets. Dans le premier, je crée des objets des entités "Sample" et "SampleList". Chaque sampleList contient un ID et un ensemble d'échantillons. Chaque échantillon contient une propriété de date et de température.CoreData: l'application se bloque lors de la suppression de la dernière instance créée

Dans le deuxième onglet, j'affiche mes données dans une tableView. Je mis en œuvre la méthode

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

afin de supprimer SampleLists. Dans mon xcdatamodel la règle de suppression pour ma relation entre SampleList et Sample est Cascade.

Mon problème est que lorsque j'essaie de supprimer SampleList que je viens de créer, l'application se bloque et je reçois un signal EXC_BAD_ACCESS. Si je le redémarre, alors je suis capable de supprimer "old" sampleList sans aucun problème.

Plus tôt, j'ai eu le problème suivant: Je ne pouvais pas afficher les exemples que j'ai créés depuis que j'ai lancé l'application, car elle s'est écrasée aussi. J'ai également reçu le signal EXC_BAD_ACCESS. En fait, il semblait que la date du dernier échantillon créé de l'ensemble était nil. Si je ne publie pas le NSDate que j'utilise pour fixer la date de l'échantillon, je n'ai plus ce problème ...

Si quelqu'un pouvait m'aider à trouver ce qui pourrait causer mes ennuis ce serait génial! !

Voici la méthode que je utilise pour créer de nouvelles instances:

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]; 

modifier: J'ai trouvé mon erreur. je faisais une comparaison pour chaque sampleDate comme ceci:

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

Où je suis en train de faire:

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

Répondre

1

Selon la documentation NSEntityDescription,

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

retourne un objet autoreleased. Donc, vous n'avez pas besoin de le libérer après:

[newSampleList setSampleSet:newSampleSet]; 

newSampleList sera autoreleased finalement, ce qui est à l'origine de ce que vous voyez comme obtenir parfois un EXC_BAD_ACCESS lorsque vous redémarrez votre application.

Le code memory management documentation d'Apple vous donnera des conseils d'utilisation lorsque vous devez libérer un objet vous-même et lorsque des objets sont libérés.

+0

newSampleSet a été créé via alloc + init, puis de nouveau retenu par newSampleList, vous devrez donc faire une [release newSampleSet] pour équilibrer alloc + init. Lorsque newSampleList est auto-libéré, il libère aussi newSampleSet. – pxl

+0

Je fais quelque chose de mal à propos de la gestion de la mémoire à coup sûr. Je regarde la documentation que vous avez indiquée. Je fais quelque chose de mal avec le NSDate. En effet, j'ai essayé de tout effacer des dates dans mon code (et xcdatamodel) et mon application ne plante plus .. Je vais jeter un regard plus profond sur ces dates et la gestion de la mémoire. – leochab

+0

Donc le lien de la documentation de gestion de la mémoire a été utile! Merci – leochab

0

J'aime utiliser une méthode comme suit pour obtenir une erreur de données de base plus d'information Rapport:

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

Vous pourriez l'utiliser comme suit:

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

Un rapport d'erreur plus informatif peut vous aider à résoudre les problèmes.

+0

Merci pour les conseils, mais je n'ai aucune erreur en sauvegardant le contexte. Mais pour l'instant, je le ferai comme ça! – leochab

Questions connexes