2 Stimmen

Speicherleck bei der Rückgabe von NSMutableArray aus der Klasse

Ich bin ziemlich neu in Objective C für das iPhone, also hoffe ich, dass Sie mich nicht töten für eine einfache Frage.

Ich habe eine App erstellt, die gut funktioniert, außer dass Instruments Speicherlecks von der folgenden Klasse meldet. Ich verwende sie, um Einstellungen von einer Klasse zu speichern und sie dann von einer anderen Klasse abzurufen. Diese Einstellungen werden in einer Datei gespeichert, damit sie jedes Mal abgerufen werden können, wenn die App ausgeführt wird.

Was kann ich tun, um die "Einstellung" aufzuheben, und gibt es irgendetwas, das getan werden kann, um die Klasse auf intelligentere Weise aufzurufen (zu verwenden)?

Danke

----- 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];

1voto

Yang Meyer Punkte 5139

In Ihrem -getParameters Methode weisen Sie ein NSMutableArray ( [[NSMutableArray alloc] initWithContentsOfFile:filePath] - d.h. Zählung von 1 beibehalten), die Sie niemals freigeben. Sie sollten Ihr Array automatisch freigeben, bevor Sie es zurückgeben: return [settings autorelease] .

Beachten Sie, dass Sie, wenn Sie die Einstellungsparameter in Ihrem mySettings und sie beibehalten wollen, sollten Sie Folgendes tun mySettings = [[aSetting getParameters] retain]; damit die Anzahl der zurückgehaltenen Daten nicht auf 0 sinkt.

1voto

Yang Meyer Punkte 5139

Oder, noch besser:

  1. erklären die settings Eigenschaft als retain Eigenschaft, dann
  2. verwenden. self.settings 代わりに settings in Ihrem -getParameters Methode, und schließlich
  3. aufrufen autorelease auf Ihre Arrays direkt nach der Zuweisung/Einrichtung.

0voto

Structurer Punkte 694

Die Klasse Settings konnte durch die Änderung von zwei Zeilen gelöst werden:

1: Verwenden Einstellungen = [NSMutableArray arrayWithContentsOfFile:filePath] anstelle von Einstellungen = [[NSMutableArray alloc] initWithContentsOfFile:filePath]

2: Auf ähnliche Weise mit Einstellungen = [NSMutableArray arrayWithObjects: Anstelle von Einstellungen = [[NSMutableArray alloc] initWithObjects

Jetzt muss ich nur noch das Leck beheben, das ich habe, wenn ich diese aus einer anderen Klasse erstelle. Irgendwelche Ideen, wie?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X