2010-05-03 3 views
1

J'ai le morceau de code suivant et quand j'utilise Instruments/Object Allocations, il me dit qu'il y a une fuite là (qui descend à sqlite3MemMalloc). Y a-t-il quelque chose que je devrais libérer?Fuite dans managedObjectContext save:

if (![managedObjectContext save:&error]) { 
    NSLog(@"Error while saving."); 
} 

La sauvegarde fonctionne bien et ne déclenche pas d'erreur.

Répondre

2

La fuite est très probablement dans l'un des objets gérés en cours d'enregistrement et il est simplement affiché ici. Si vous regardez la pile dans Instruments, vous pouvez probablement voir l'objet qui fuit. Comme il n'apparaît qu'à l'enregistrement, c'est probablement dans le code de validation.

+0

Merci pour votre réponse. Que voulez-vous dire par "code de vérification"? Aussi, d'après ce que j'ai essayé, j'ai l'impression que les objets gérés sont auto-libérés. – Kamchatka

+0

Les objets ManagedObjects sont eux-mêmes conservés/libérés par le contexte, mais tout objet qu'ils créent eux-mêmes peut fuir. Par exemple, si vous avez une méthode personnalisée qui a initialisé une chaîne mais ne l'a pas libérée. – TechZen

+0

Désolé "vérification" devrait être "validation". Ce sont les méthodes qui sont appelées juste avant qu'un objet géré soit sauvegardé pour s'assurer qu'un attribut/propriété est dans l'état correct avant d'être sauvegardé. Par défaut, les méthodes prennent la forme de 'validatePropertyName: error:'. – TechZen

1

Avez-vous des sous-catégories de vos instances de NSManagedObject?

Lorsque vous définissez une valeur dans vos instances NSManagedObject, en libérez-vous la propriété? Par exemple, si vous faites le code suivant:

NSString *someString = [[NSString alloc] initWithString:@"Blah"]; 
[myManagedObject setValue:someString forKey:@"stringValue"]; 

Vous seriez une fuite de mémoire parce que vous êtes encore que la possession NSString. C'est ce à quoi TechZen fait référence ci-dessus.