Утечка памяти с помощью SubstringWithRange NSString - PullRequest
2 голосов
/ 14 июля 2011

Запустив мою программу с помощью инструмента «Утечки» в X-Code, она указывает на эту функцию как на основную причину утечек памяти.

    + (NSMutableArray *) getColumns:(NSString *) deviceHtml {

        NSMutableArray *ret = [[[NSMutableArray alloc] init] autorelease];
        NSRegularExpression *m = [[NSRegularExpression alloc] initWithPattern:@"<td[\\w\\W\\d\\s</>]*?>[\\w\\W\\d\\s]+?</td>" options:NSRegularExpressionCaseInsensitive error:nil];

        NSArray *results = [m matchesInString:deviceHtml options:NSMatchingCompleted range:NSMakeRange(0, [deviceHtml length])];
        [m release];

        for (NSTextCheckingResult * res in results) {
            NSString *cleaned = [deviceHtml substringWithRange:[res range]];
            int firstClose = [cleaned rangeOfString:@">"].location;
            int cleanedLength = [cleaned length];
            NSString *cleaned1 = [cleaned substringWithRange:NSMakeRange(firstClose+1, cleanedLength-(firstClose+1))];
            int closingComment = [cleaned1 rangeOfString:@"</td"].location;
            NSString *cleaned2 = [cleaned1 substringWithRange:NSMakeRange(0, closingComment)];
            NSString *cleaned3 = [cleaned2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            [ret addObject:cleaned3];
        }
        return ret;
    }

В частности, эта строка,

    NSString *cleaned2 = [cleaned1 substringWithRange:NSMakeRange(0, closingComment)];

Я не совсем уверен насчет управления памятью с помощью NSCFStrings и удобных методов, поэтому я немного застрял, кто-нибудь может дать мне несколько советов?

Спасибо

1 Ответ

2 голосов
/ 14 июля 2011

Во-первых, метод должен быть не getColumns:, а, скажем, что-то вроде columnsForDevice:. get* как префикс имеет очень специфическое значение в Какао, и это не так.

Во-вторых, инструмент «Утечки» показывает вам, где была выделена утечка , а не , где утечка на самом деле может происходить .

Если возвращенный массив будет чрезмерно сохранен в другом месте, это будет источником вашей утечки.

...