【问题标题】:Instrument says I have 12 memory leaks in this, how do I get rid of them?Instrument说我有12个内存泄漏,我该如何摆脱它们?
【发布时间】:2010-02-26 16:21:09
【问题描述】:

老实说,我无法弄清楚何时释放这些对象。谁能指导我正确的方向?

+ (DrawData*) load {
    DrawData *newDrawData = [[DrawData alloc] init];

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

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSFileManager *fm = [NSFileManager defaultManager];

    BOOL keepLoading = YES;
    int curIndex = 0;

    while ( keepLoading ) {

        BoardData *tmpBoard = [[BoardData alloc] init];

        NSString *imageFilename = [[NSString alloc] initWithFormat:@"iCanvas_image_%d.png", curIndex];
        NSString *metadataFilename = [[NSString alloc] initWithFormat:@"iCanvas_metadata_%d.txt", curIndex];
        NSString *layersFilename = [[NSString alloc] initWithFormat:@"iCanvas_layers_%d.dat", curIndex];

        imageFilename = [documentsDirectory stringByAppendingPathComponent:imageFilename];
        metadataFilename = [documentsDirectory stringByAppendingPathComponent:metadataFilename];

        if ( [fm fileExistsAtPath:imageFilename] && [fm fileExistsAtPath:metadataFilename] ) {

            NSString *metadataFile = [[NSString alloc] initWithContentsOfFile:metadataFilename];
            NSArray *metadata = [metadataFile componentsSeparatedByCharactersInSet:
                                 [NSCharacterSet whitespaceCharacterSet]];
            tmpBoard.drawImageTypeOverlay = [[metadata objectAtIndex:0] intValue];
            tmpBoard.brushSize = [[metadata objectAtIndex:1] floatValue];
            tmpBoard.brushColorRed = [[metadata objectAtIndex:2] floatValue];
            tmpBoard.brushColorGreen = [[metadata objectAtIndex:3] floatValue];
            tmpBoard.brushColorBlue = [[metadata objectAtIndex:4] floatValue];
            tmpBoard.brushColorAlpha = [[metadata objectAtIndex:5] floatValue];
            tmpBoard.isErasing = [[metadata objectAtIndex:6] intValue];
            tmpBoard.eraseSize = [[metadata objectAtIndex:7] floatValue];
            tmpBoard.isSelected = [[metadata objectAtIndex:8] intValue];
            tmpBoard.layers = [NSMutableArray arrayWithContentsOfFile:layersFilename];
            [newDrawData addBoard:tmpBoard];
        }
        else {
            keepLoading = NO;
        }

        [tmpBoard release];

    }

    [pool release];

    return newDrawData;

}

【问题讨论】:

    标签: ios objective-c iphone memory-leaks


    【解决方案1】:

    你应该养成以下两种习惯:

    1) 添加到自动释放池

    NSString *imageFilename = [[[NSString alloc] initWithFormat:@"iCanvas_image_%d.png", curIndex] autorelease];
    

    2) 发送发布消息(完成后)

    [imageFilename release];
    

    到您使用此模式声明的变量:

        NSString *imageFilename = [[NSString alloc] initWithFormat:@"iCanvas_image_%d.png", curIndex];
    

    基本上是这样的

    [[blah alloc] init];
    

    阅读更多:http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/

    【讨论】:

    • ...或使用方便的方法,如 [NSString stringWithFormat:...];
    【解决方案2】:
    1. 我不确定您是否要返回自动发布的 newDrawData - 请检查您的所有权逻辑。
    2. imageFilename 和 metadataFilename 在 +alloc/-initWithFormat 之后直接被覆盖:
    3. 元数据文件已分配但未释放。

    第 2 点和第 3 点在 while 循环中重复,这可能会增加实际泄漏的数量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 2011-02-18
      • 2022-07-30
      • 1970-01-01
      相关资源
      最近更新 更多