2010-05-26 4 views
2

Je suis assez nouveau à l'objectif C pour l'iPhone, donc j'espère que vous ne me tuerez pas pour poser une question simple.La fuite de mémoire dans le renvoi NSMutableArray de la classe

J'ai fait une application qui fonctionne bien, sauf que Instruments signale des fuites de mémoire de la classe ci-dessous. Je l'utilise pour stocker les paramètres d'une classe, puis les récupérer dans une autre classe. Ces paramètres sont stockés dans un fichier afin qu'ils puissent être récupérés chaque fois que l'application est exécutée. Que puis-je faire pour libérer le "réglage" et y a-t-il quelque chose qui peut être fait pour appeler (utiliser) la classe d'une manière plus intelligente?

Merci

----- Below is Settings.m ----- 

#import "Settings.h" 

@implementation Settings 

@synthesize settings; 

-(NSString *)dataFilePath // Return path for settingfile, including filename 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    return [documentsDirectory stringByAppendingPathComponent:kUserSettingsFileName]; 
} 

-(NSMutableArray *)getParameters // Return settings from disk after checking if file exist (if not create with default values) 
{ 
    NSString *filePath = [self dataFilePath]; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) // Getting data from file 
    { 
     settings = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 
    } 

    else // Creating default settings 

    { 
     settings = [[NSMutableArray alloc] initWithObjects: 
         [NSNumber numberWithInteger:50],   
         [NSNumber numberWithInteger:50],   
         nil]; 

     [settings writeToFile:[self dataFilePath] atomically:YES]; 

    } 
    return settings; 
} 


    ----- Below is my other class from where I call my Settings class ----- 

    // Get settings from file 
    Settings *aSetting = [[Settings alloc] init]; 

    mySettings = [aSetting getParameters]; 
    [aSetting release]; 

Répondre

0

réussi à résoudre la classe des paramètres en modifiant deux lignes:

1: Utilisation paramètres = [NSMutableArray arrayWithContentsOfFile: filePath] au lieu de paramètres = [[NSMutableArray alloc] initWithContentsOfFile: filePath]

2: d'une manière similaire en utilisant les paramètres = [NSMutableArray arrayWithObjects: au lieu de paramètres = [[NSMutableArray alloc] initWithObjects

Maintenant, je n'ai plus qu'à résoudre la fuite que j'ai quand je les crée à partir d'une autre classe. Des idées comment?

1

Dans votre -getParameters méthode alloc/init un NSMutableArray ([[NSMutableArray alloc] initWithContentsOfFile:filePath] - à savoir conserver le nombre de 1) que vous ne relâchez. Vous devriez auto-lister votre tableau avant de le retourner: return [settings autorelease].

Notez que si vous avez besoin de mettre les paramètres de réglage dans la variable mySettings et que vous voulez le garder autour, vous devez faire mySettings = [[aSetting getParameters] retain]; afin que le conserver nombre ne laissez pas tomber à 0.

+0

Salut à nouveau. Essayé avec l'autorelease, mais ça ne marche pas. Toujours les mêmes résultats. Merci pour l'essai si. – Structurer

+1

Plus de détails. Lorsque vous exécutez l'autorelease dans le code, l'application ne démarre pas sur le téléphone lorsque Instruments est en cours d'exécution. Sans instruments ça marche bien, mais donc ça ne marche pas autorelease ;-) – Structurer

1

Ou, mieux encore:

  1. déclare la propriété settings comme propriété retain ing, puis
  2. utilisation self.settings au lieu de settings dans votre méthode -getParameters, et enfin
  3. appelez autorelease sur vos tableaux juste après les avoir alloués/validés.
+0

Merci Yang Juste une question, devrais-je éviter aurorelease lors du codage pour l'iPhone? – Structurer

+0

Je dirais que cela dépend de votre application. En fin de compte, vous échangez les performances pour plus de lisibilité. Voir http://stackoverflow.com/questions/193288/what-is-the-cost-of-using-autorelease-in-cocoa et http://stackoverflow.com/questions/613583/why-is-autorelease-spécialement -dangereux-cher-pour-iphone-applications pour une discussion des avantages et des inconvénients. Dans ma suggestion, au lieu de "(3) appel autorelease" vous pouvez faire ce qui suit: NSArray * tempArray = [[NSMutableArray alloc] init ...]; self.settings = tempArray; [libération de tempArray]; –