Frage

Ich habe die letzten Stunden verbracht versuchen, das Speicherleck in meinem Code zu finden. Hier ist sie:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

expression = [expression stringByTrimmingCharactersInSet:
              [NSCharacterSet whitespaceAndNewlineCharacterSet]]; // expression is an NSString object.

NSArray *arguments = [NSArray arrayWithObjects:expression, [@"~/Desktop/file.txt" stringByExpandingTildeInPath], @"-n", @"--line-number", nil];
NSPipe *outPipe = [[NSPipe alloc] init];

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/usr/bin/grep"];
[task setArguments:arguments];
[task setStandardOutput:outPipe];
[outPipe release];

[task launch];

NSData *data = [[outPipe fileHandleForReading] readDataToEndOfFile];

[task waitUntilExit];
[task release];

NSString *string = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding];
string = [string stringByReplacingOccurrencesOfString:@"\r" withString:@""];

int linesNum = 0;

NSMutableArray *possibleMatches = [[NSMutableArray alloc] init];

if ([string length] > 0) {

    NSArray *lines = [string componentsSeparatedByString:@"\n"];
    linesNum = [lines count];

    for (int i = 0; i < [lines count]; i++) {

        NSString *currentLine = [lines objectAtIndex:i];
        NSArray *values = [currentLine componentsSeparatedByString:@"\t"];

        if ([values count] == 20)
            [possibleMatches addObject:currentLine];
    }
}
[string release];
[pool release];

return [possibleMatches autorelease];

Ich habe versucht, die wenigen Grundregeln der Cocoa Speicherverwaltung zu folgen, aber irgendwie scheint es noch ein Leck zu sein, ich glaube, es ist ein Array, das undicht ist. Es ist auffällig, wenn possibleMatches groß ist. Sie können den Code versuchen, mit einer großen Datei als „~ / Desktop / file.txt“ und als Ausdruck etwas, dass die Renditen vieler Ergebnisse, wenn grep-ing.

Was ist der Fehler, den ich mache?

Vielen Dank für jede Hilfe!

- Ry

EDIT: Ich habe gerade den Clang Static Analyzer Lecks in meinem Code zu finden, aber es funktioniert nicht finden. Es findet nur tote Initialisierungen, aber diejenigen, kann nicht für meine Lecks verantwortlich sein ...

War es hilfreich?

Lösung

Hier:

NSString *string = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding];
string = [string stringByReplacingOccurrencesOfString:@"\r" withString:@""];

Sie überschreiben die string Objektzeiger ohne Öffnen oder Schließen der Original-Zeichenkette autoreleasing. Stattdessen string am Ende des Verfahrens zum Loslassen zu tun:

NSString *string = [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding] autorelease];
string = [string stringByReplacingOccurrencesOfString:@"\r" withString:@""];

Andere Tipps

Ein wahrscheinlicher Weg zu einer Lösung ist Leaks template Instrumente zu verwenden. Durch die Einstellung des Inspektionsbereiches kurz vor diesem Code zu starten, dann suchen, bei den Zuweisungen sind noch am Leben, nachdem dieser Code zurückgegeben hat, können Sie sehen, was durchgesickert bekam, und dann Blick auf den Zeigern Geschichten Lecks und die entsprechenden Stapel Spuren genau zu sehen, was passiert ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top