утечка памяти - NSData и NSMutableString - PullRequest
0 голосов
/ 22 июня 2011

Анализ файла размером 20 МБ, который слишком велик, чтобы сделать его одним целым на 2G iPod touch.Я закомментировал весь код, кроме части NSData / NSMutableString, и все еще имеет утечку.Я не понимаю ....

метод поддержки для чтения фрагмента из файла:

+ (NSData *) dataWithContentsOfFile:(NSString *)path atOffset:(off_t)offset withSize:(size_t)bytes  {
    FILE *file = fopen([path UTF8String], "rb");
    if(file == NULL)
        return nil;

    void *data = malloc(bytes);  // check for NULL!
    fseeko(file, offset, SEEK_SET);
    fread(data, 1, bytes, file);  // check return value, in case read was short!
    fclose(file);

    // NSData takes ownership and will call free(data) when it's released
    return [NSData dataWithBytesNoCopy:data length:bytes];
}

и кода barebones, который пропускает:

while( cnt<total) {
    NSAutoreleasePool* pool= [[NSAutoreleasePool alloc] init];

    NSData* data= [NSData dataWithContentsOfFile:fullPath atOffset:cnt withSize:MIN(100000,total-cnt)];
    NSString* xmlFragment  = [[NSString alloc] initWithBytes: [data bytes] length:[data length] encoding: NSUTF8StringEncoding];
    cnt+= [xmlFragment length];

    [pool drain];
}

1 Ответ

1 голос
/ 22 июня 2011

Вы делаете alloc-init каждый раз, когда находитесь в цикле, но нет выпуска, поэтому в вашем коде есть утечка.утверждение выше.Если вы это сделаете,

NSString* xmlFragment  = [[[NSString alloc] initWithBytes: [data bytes] length:[data length] encoding: NSUTF8StringEncoding] autorelease];

Он будет освобожден в [pool drain];.Однако цикл кажется бессмысленным.Вы, вероятно, хотели сделать немного больше, например добавить xmlFragment в изменяемую строку?

...