1

このメモリリークを修正するにはどうすればよいですか? NSBezierPath のコレクションはありますか? このメモリリークを修正するにはどうすればよいですか? 何かアドバイス?ARCを使用しています。

int main(int argc, const char * argv[])
{
    @autoreleasepool {

        // insert code here...
        for(int j=0;j<5000;j++){
            NSLog(@"Hello, World!");
            NSSize imageSize = NSMakeSize(512, 512);
            NSImage *image = [[NSImage alloc] initWithSize:imageSize];
            //draw a line:
            for(int i=0;i<1000;i++){
                [image lockFocus];
                float r1 = (float)(arc4random() % 500);
                float r2 = (float)(arc4random() % 500);
                float r3 = (float)(arc4random() % 500);
                float r4 = (float)(arc4random() % 500);
                [NSBezierPath strokeLineFromPoint:NSMakePoint(r1, r2) toPoint:NSMakePoint(r3, r4)];
            }
            //...

            NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)];
            NSData *pngData = [imageRep representationUsingType:NSPNGFileType properties:nil];
            [image unlockFocus];

            NSString *jstring = [NSString stringWithFormat:@"%d", j];
            jstring = [jstring stringByAppendingString:@".png"];
            [pngData writeToFile:jstring atomically:YES];
        }
    }

    return 0;
}
4

1 に答える 1

5

ARCを使用していることがわかったので、回答を修正しました。

おそらくリークしているわけではありませんが、ループが終了するまで自動解放プールが空にならないため、ループの反復ごとに自動解放プールがどんどん大きくなっています。

あなたがする必要があるのは、ループ内で二次的な自動解放プールを採用することです。これを説明するために、コードの改訂版を次に示します。

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        // insert code here...
        for(int j=0; j<5000; j++) {
            NSLog(@"Hello, World!");
            NSSize imageSize = NSMakeSize(512, 512);
            @autoreleasepool {
                NSImage *image = [[NSImage alloc] initWithSize:imageSize];
                //draw a line:
                NSData *pngData;
                for(int i=0;i<1000;i++){
                    [image lockFocus];
                    float r1 = (float)(arc4random() % 500);
                    float r2 = (float)(arc4random() % 500);
                    float r3 = (float)(arc4random() % 500);
                    float r4 = (float)(arc4random() % 500);
                    [NSBezierPath strokeLineFromPoint:NSMakePoint(r1, r2) toPoint:NSMakePoint(r3, r4)];
                    //...

                    NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithFocusedViewRect:NSMakeRect(0, 0, imageSize.width, imageSize.height)];
                    pngData = [imageRep representationUsingType:NSPNGFileType properties:nil];
                    [image unlockFocus];
                }

                NSString *jstring = [NSString stringWithFormat:@"%d", j];
                jstring = [jstring stringByAppendingString:@".png"];
                [pngData writeToFile:jstring atomically:YES];
            }
        }
    }

    return 0;
}

ただし、別の問題があるようです。ファイルのフル パスを作成していますか?

于 2012-12-19T22:06:32.217 に答える