2011-06-21 8 views
2

J'ai commencé à tester mon application dans Instruments pour nettoyer les fuites de mémoire. J'ai été capable d'effacer toutes les fuites de mémoire, sauf celles liées aux données de base. Instruments me pointe toujours à cette section de code:Fuites de mémoire de données de base

NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 
    // Handle the error 
} 

Je déclare la managedObjectContext dans mon fichier d'en-tête avec le code suivant:

@interface UpperBody : UITableViewController <UITableViewDelegate, UITableViewDataSource> { 

IBOutlet UITableView *upperTable; 
NSMutableArray *exercises; 
NSManagedObjectContext *managedObjectContext; 

} 

@property (nonatomic, retain) NSMutableArray *exercises; 
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext; 

je libère le managedObjectContext dans le (vide) section dealloc. Voici la section complète du code en utilisant la managedObjectContext:

- (void)loadExercises { 

if (managedObjectContext == nil) { 
    managedObjectContext = [(iFitAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
} 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Exercises" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"category == 1"]; 
[request setPredicate:predicate]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"exerciseName" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

NSError *error = nil; 
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
if (mutableFetchResults == nil) { 
    // Handle the error 
} 

[self setExercises:mutableFetchResults]; 
// [exercises addObject:@"Add Exercise"]; 
NSLog(@"Count of exercises %i", exercises.count); 
[mutableFetchResults release]; 
[request release]; 
[self.tableView reloadData]; 

} 

Tout conseil sur ce qui pourrait être à l'origine des fuites serait grandement apprécié! Merci d'avance!

+0

Est-ce que vous libérez des 'exercices' dans votre méthode' dealloc'? – albertamg

+0

Oui, je libère des exercices dans ma méthode dealloc. =/Je ne suis pas sûr pourquoi Instruments pointe vers le NSMutableArray * mutableFetchResults cependant. Je publie managedObjectContext, results et mutableFetchRequests. –

+0

Les instruments pointent vers l'emplacement de l'objet divulgué, et non là où il a été divulgué. – albertamg

Répondre

0

kIl y avait probablement une fuite dans le code que j'avais ci-dessus. Je me suis débrouillé en déclarant un NSManagedObjectContext en utilisant simplement un pointeur sur un si nécessaire. Voici un exemple du code:

iFitAppDelegate *appDelegate = (iFitAppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext; 

Ce fixe ma fuite, il doit avoir eu à voir avec la façon dont j'allouer et libérer le NSManagedObjectContext. Merci pour les pointeurs, @albertamg!

+0

Vous êtes les bienvenus! – albertamg