乐器说我有12个内存泄漏,如何摆脱它们?

时间:2010-02-26 16:21:09

标签: ios objective-c iphone memory-leaks

老实说,我无法弄清楚何时释放这些物品。任何人都能引导我朝着正确的方向前进吗?

+ (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;

}

2 个答案:

答案 0 :(得分:6)

你应该养成以下习惯:

1)添加到自动释放池

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

OR

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/

答案 1 :(得分:0)

  1. 我不确定您是否要返回自动释放的newDrawData - 检查您的所有权逻辑。
  2. 在+ alloc / -initWithFormat之后直接覆盖imageFilename和metadataFilename:
  3. 已分配metadataFile但尚未发布。
  4. 点2和3在while循环中重复,这可能会增加实际泄漏的数量。