在我的代码中找不到泄漏

时间:2010-04-01 19:35:13

标签: cocoa memory-management nsarray nstask

我花了最近几个小时试图在我的代码中找到内存泄漏。这是:

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

我试图遵循Cocoa内存管理的一些基本规则,但不知怎的,似乎仍然存在漏洞,我相信这是一个泄漏的数组。如果可能的话,它很明显。您可以使用任何大文件作为“〜/ Desktop / file.txt”来尝试代码,并在grep-ing时生成许多结果的表达式。

我犯的错误是什么?

感谢您的帮助!

- Ry

编辑:我刚刚使用Clang静态分析器查找代码中的泄漏,但它没有找到任何泄漏。它只能找到死的初始化,但那些不能对我的泄漏负责......

2 个答案:

答案 0 :(得分:3)

下面:

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

您在不释放或自动释放原始字符串的情况下覆盖string对象指针。不要在方法结束时释放string,而是:

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

答案 1 :(得分:0)

解决方案的可能途径是使用Instruments的Leaks模板。通过将检查范围设置为在此代码之前启动,然后在返回此代码后查看哪些分配仍处于活动状态,您可以查看泄漏的内容,然后查看泄漏的指针历史记录和相应的堆栈跟踪以查看确切的内容发生了什么。