代码之家  ›  专栏  ›  技术社区  ›  Frank

返回对象上的内存泄漏

  •  2
  • Frank  · 技术社区  · 16 年前

    -(id) getOptions {
        FileManager *file = [[FileManager alloc] initWithFileName:@"optionsFile.dat"];
        Options *options = [[Options alloc] init];
        NSMutableArray *fileArray = [[NSMutableArray alloc] init];
        fileArray = [file loadFile: @"optionsFile"];
    
        if ([fileArray count] > 0) {
            options = [fileArray objectAtIndex:0];
        }
        [file release];
        return options;
    }
    

    我尝试保留返回的对象,并在使用后立即释放:

    id options = [[self getOptions] retain];
    [options release];
    

    编辑:

    我只是添加了这个,看看它是否能解决任何问题,但我仍然在泄漏:

    FileManager *file = [[FileManager alloc] initWithFileName:@"optionsFile.dat"];
    NSMutableArray *fileArray = [file loadFile: @"optionsFile"];
    Options *options = [fileArray objectAtIndex:0];
    [file release];
    return options; 
    
    4 回复  |  直到 16 年前
        1
  •  5
  •   Cœur Gustavo Armenta    7 年前

    每人 init 或 retain 打电话,你应该打电话 release (或 autorelease ).

    Options 对象缺少一个 释放 getOptions ,或返回自动释放的实例。惯例通常是返回自动释放的对象,为此,只需将return语句更改为:

    return [options autorelease];
    

    这样,如果调用者想要保留它,他们可以,但是如果他们只是使用结果并丢弃对象,他们不必做任何事情,它将被调用者释放 autorelease pool

    也, fileArray 没有发布。完成后,打电话给我 [fileArray release] ;

    你可能应该仔细阅读这本书的部分内容 Memory Management Guide 更好地了解如何管理此类泄漏。

        2
  •  0
  •   Gordon Seidoh Worley    16 年前

    fileArray

        3
  •  0
  •   Elfred    16 年前

    看看它,选项和fileArray正在泄漏。代码应该如下所示:

    -(id) getOptions {
       FileManager *file = [[FileManager alloc] initWithFileName:@"optionsFile.dat"];
        Options *options = [[Options alloc] init];
        //NSMutableArray *fileArray = [[NSMutableArray alloc] init]; This instance was leaking
        //fileArray = [file loadFile: @"optionsFile"]; 
        NSMutableArray *fileArray = [file loadFile: @"optionsFile"];
    
        if ([fileArray count] > 0) {
            options = [fileArray objectAtIndex:0];
        }
        [file release];
        return [options autorelease];
    }