2010-03-01 5 views
1

J'ai une fuite spécifique que je n'arrive pas à creuser au fond, car ma recherche finit toujours dans certaines bibliothèques Apple. Toute aide de certains vétérans à ce sujet serait appréciée.Données de base/NSArray causant des fuites?

Voici le code source pertinente: (fuite indiquée par un commentaire)

- (void)viewDidLoad { 
//[super viewDidLoad]; 

NSManagedObjectContext *context = [(iEatAppDelegate*)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:creator action:@selector(launchCreatorWindow)]; 
self.navigationItem.rightBarButtonItem = addButton; 

NSFetchRequest *fetReq = [[NSFetchRequest alloc] init]; 
[fetReq setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:context]]; 
NSError *e = nil; 

NSArray *temp = [context executeFetchRequest:fetReq error:&e]; 
//leaking here according to performance tool 

self.tableObjects = [[NSMutableArray alloc] initWithArray:temp]; 

if (e) { 
    NSLog(@"%@, %@", e, [e description]); 
} 
[fetReq release]; 
} 

J'ai essayé la libération temporaire, mais il est écrasé avec le EXC_BAD_ACCESS que je crois signifie qu'il est déjà autoreleased. L'outil de gestion des fuites indique qu'il s'agit d'une catégorie: CFArray (store-deque) Événement: Malloc indique également que ma bibliothèque est responsable. Ceci est la trace de la pile, le numéro 8 étant mon cadre viewDidLoad:

0 CoreFoundation __CFAllocatorSystemAllocate 
1 CoreFoundation CFAllocatorAllocate 
2 CoreFoundation _CFAllocatorAllocateGC 
3 CoreFoundation _CFArrayReplaceValues 
4 CoreFoundation CFArrayReplaceValues 
5 CoreFoundation -[__NSPlaceholderArray initWithObjects:count:] 
6 CoreFoundation -[NSArray initWithArray:copyItems:] 
7 CoreFoundation -[NSArray initWithArray:] 

Celui-ci m'a vraiment bloqué, toute aide est grandement appréciée.

Répondre

1

Cela provoque votre fuite:

self.tableObjects = [[NSMutableArray alloc] initWithArray:temp]; 

vous créez un tableau avec un nombre de conserver 1, vous utilisez self.tableObje cts qui (si cette propriété est marquée comme retain) porte le nombre à 2.

Ensuite, dans dealloc lorsque vous libérez le tableau, le nombre est redescendu à 1, et non à 0, de sorte que le tableau n'est jamais libéré.

Au lieu de cela, faire ceci:

self.tableObjects = [NSMutableArray arrayWithArray:temp]; 

qui retourne un tableau autoreleased, de sorte que le nombre final sera seulement conserver 1.

0

La réponse est qu'il me manque quelque chose de basique. [alloc NSMutableArray] conservent count = 1 = self.tableObjects retenir count = 2 dealloc conserver toujours pas compte 0 fuite.

Désolé de cette

0

Ce n'est pas la cause de votre fuite, mais je pensais que ce serait intéressant de souligner toute façon: Vous devez libérer addButton juste après que vous avez attribué à l'rightBarButtonItem car il est va être nécessaire/utilisé à nouveau:

self.navigationItem.rightBarButtonItem = addButton; 
[addButton release]; 
Questions connexes