2010-11-20 5 views
0

J'ai une fuite de mémoire quand j'appelle une méthode qui me renvoie une chaîne ---- la définition de la méthode est la suivantesituation fuite de mémoire dans iphone

-(NSMutableArray *)read 
{ 
NSMutableArray *dataArray = [[NSMutableArray alloc] init]; 

//picking data from database here 


return dataArray; 
} 

ce spectacle une grande fuite de mémoire i aussi essayé --- NSMutableArray *dataArray = [[[NSMutableArray alloc] init]autorelease];

mais ce processus de vérification leack temps se pendre

Je ne peux pas libérer ce tableau avant le retour

aidez s'il vous plaît

Répondre

3
-(NSMutableArray *)read 
{ 
    NSMutableArray *dataArray = [[NSMutableArray alloc] init]; 

    //picking data from database here 

    return dataArray; 
} 

Tout ce qui utilise la méthode read va attendre à récupérer un objet qui ne lui appartient pas. Cependant, comme écrit ici, dataArray est toujours détenu au point de retour. Vous ne pouvez pas le libérer parce que cela pourrait le faire disparaître complètement. Vous devez, dans ce cas autorelease le tableau. Vous pouvez faire ceci:

-(NSMutableArray *)read 
{ 
    NSMutableArray *dataArray = [[[NSMutableArray alloc] init] autorelease]; 

    //picking data from database here 

    return dataArray; 
} 

ou cette

-(NSMutableArray *)read 
{ 
    NSMutableArray *dataArray = [[NSMutableArray alloc] init]; 

    //picking data from database here 

    return [dataArray autorelease]; 
} 

Vous dites « processus de vérification de fuite se pendre » mais je ne suis vraiment pas sûr de ce que vous entendez par là. Qu'il se bloque, se bloque ou joue l'hymne national du Botswana, vous devez absolument libérer le tableau retourné et tout autre problème est en fait un problème différent. Eventuellement, vous oubliez de conserver les données ailleurs.

+0

+1 --- merci .... – Saawan

-1

La propriété de l'objet retourné peut être renvoyée à l'objet qui reçoit de cette fonction. Vous pouvez faire du débogage avec le nombre de conserver l'objet en utilisant quelque chose comme ça ...

NSLog(@"Retain count: %i", [dataArray retainCount]); 

Allumez la console de débogage (Commande + R dans Xcode) pour voir la sortie NSLog.

+4

Je recommande de ne pas vous soucier du nombre de retenues d'un objet; En raison de choses hors de notre contrôle, le nombre de retenue n'est pas utile du point de vue du débogage. Il est là pour que l'objet sache quand se libérer. –

+0

+1 @ Jonathan est correct, et même la documentation d'Apple pour la méthode 'retainCount' dit de ne pas l'utiliser pour le débogage des problèmes de gestion de la mémoire. Un de ses problèmes potentiels est qu'il ne prend pas en compte en attendant 'autorelease's. – dreamlax

+0

NE PAS APPELER retainCount. Jamais et certainement ** pas ** pour "déboguer". – bbum

1

Une autre réponse plus ... Il y a beaucoup de conventions en touche de cacao de cacao /, il y a one d'entre eux qui dit que si une méthode a le préfixe init alors vous aurez la propriété de cet objet (d'où vous avez pour le libérer)

Ce n'est pas votre cas, donc si vous faites:

DatabaseReader *dbReader = [[DatabaseReader alloc] init]; 
NSMutableArray *mutArray = [dbReader read]; 
[dbReader release]; 

vous n'êtes pas censé libérer mutArray. MAIS, l'objet créé doit être libéré par quelqu'un. Donc vous pouvez faire comme JeremyP a écrit. alloc/init et placez-le dans un pool autorelease à l'intérieur de l'implémentation de la méthode de lecture. Ou, vous pouvez faire:

-(NSMutableArray *)read 
{ 
    NSMutableArray *dataArray = [NSMutableArray array]; 
    //IMPORTANT: 
    //Did you noticed that I am not using any method 
    //with init prefix for the creation of dataArray ? 
    //so I don't need to release by my self ;) 

    //picking data from database here 

    return dataArray; 
} 

Qui est fondamentalement la même chose. ;)

+0

Ce n'est pas tout à fait exact. La propriété est acquise par la méthode de la classe 'alloc', pas par la méthode de l'instance' init'. Voir la documentation de [alloc] de NSObject (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/doc/uid/20000050 -alloc) et se référer également aux [Memory Management Rules] (http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html). – dreamlax