2012-12-19 2 views
1

Instruments détecter une fuite de mémoire:fuite de mémoire avec des données Étrange base

(Leaked Object= "__NSCFString") 

Voici mon code:

-(NSArray*)loadAllPages{ 
    NSManagedObjectContext *context = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Page" inManagedObjectContext:context]; 
    [fetchRequest setEntity:entity]; 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] 
             initWithKey:@"date" ascending:YES]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
    [sortDescriptor release]; 

    NSError *error = nil; 
    myArray = [[NSArray alloc ]initWithArray:[[context executeFetchRequest:fetchRequest error:&error]autorelease]]; 

    [fetchRequest release]; 
    if (myArray == nil) 
     NSLog(@"%@",error); 
    return myArray; 
} 

La ligne où la fuite est pointé est l'initialisation de myArray. Si je ne retourne pas myArray, cette fuite ne se produit pas, donc c'est étrange pour moi.

+0

Comment appelez-vous la méthode? Utilisez-vous ARC? –

+0

Où 'myArray' est-il déclaré? –

+0

dans mon fichier .h. Ce n'est pas grave si je le déclare dans la fonction ou dans .h, il donne juste la même fuite. :( – Sufian

Répondre

0

Dans cette ligne

myArray = [[NSArray alloc ]initWithArray:[[context executeFetchRequest:fetchRequest error:&error]autorelease]]; 

les crochets sont légèrement faux. Le autorelease est envoyé au résultat de [context executeFetchRequest:...], et non au tableau alloué.

[context executeFetchRequest:...] renvoie un tableau auto-libéré. L'envoi de autorelease à ce tableau est une erreur. Et myArray est alloué, mais pas publié dans votre code.

L'analyseur statique Xcode signale également comme une erreur:

enter image description here

Je suppose que vous vouliez dire

myArray = [[[NSArray alloc] initWithArray:[context executeFetchRequest:fetchRequest error:&error]] autorelease]; 

qui se traduirait par un tableau autoreleased myArray.

+0

Non, je l'ai fait intentionnellement.Si je change à ce que vous avez suggéré, il me donne une fuite avec des détails: Responsable Frame = "newFetchedRowsForFetchPlan_MT" & Bibliothèque responsable = "CoreData" – Sufian

+0

@Sufian: Mais cela me semble un problème différent.J'ai mis à jour ma réponse pour clarifier pourquoi je pense que votre code a une erreur. Avez-vous essayé la fonction "Produit -> Analyser" dans Xcode? Cela peut souvent aider à trouver des problèmes de conservation/libération –

+0

Oui, j'ai essayé la fonction Analyser, mais cela ne montre rien d'étrange. à cause du retour du tableau, je mets même les résultats dans l'autre tableau (en copiant des éléments du myArray) mais la même raison pour la fuite – Sufian

0

Si vous n'utilisez pas ARC.

changement return myArray; avec return [myArray autorelease];

Vous retournez un objet alloué à partir de votre méthode, la propriété de cet objet est encore la méthode, dans de tels scénarios, vous devez renvoyer un objet auroreleased et conservez-le sur le côté de la réception. Ensuite, la propriété de cet objet sera avec la méthode d'appel.

+0

Maintenant, il me donne des fuites avec des détails: Responsible Frame = "newFetchedRowsForFetchPlan_MT" & Bibliothèque responsable = "CoreData".: -S – Sufian