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

Jab*_*Jab 1 iphone memory-leaks objective-c ios

老实说,我无法弄清楚何时释放这些物体.谁能引导我朝着正确的方向前进?

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

}
Run Code Online (Sandbox Code Playgroud)

mr-*_*-sk 6

你应养成以下任何一种习惯:

1)添加到自动释放池

NSString *imageFilename = [[[NSString alloc] initWithFormat:@"iCanvas_image_%d.png", curIndex] autorelease];
Run Code Online (Sandbox Code Playgroud)

要么

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

[imageFilename release];
Run Code Online (Sandbox Code Playgroud)

使用此模式声明的变量:

    NSString *imageFilename = [[NSString alloc] initWithFormat:@"iCanvas_image_%d.png", curIndex];
Run Code Online (Sandbox Code Playgroud)

这基本上是

[[blah alloc] init];
Run Code Online (Sandbox Code Playgroud)

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