0

Xミリ秒ごとに無限の量のスクリーンショットを撮り、それらをイメージビューに表示する小さなアプリでメモリの問題が発生します。自動リリースを使用しても、メモリがすぐにいっぱいになります。コードは次のとおりです。

- (void)draw {
    do {
        @autoreleasepool {
            CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay);

            NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1];
            NSImage *image = [[NSImage alloc] init];
            [image addRepresentation:bitmapRep];
            _imageView.image = image;
            [NSThread sleepForTimeInterval:1];
        }
    }while(true);
}

何か案は?

4

2 に答える 2

5

を使用してイメージを解放する必要がありますCGImageRelease

- (void)draw {
    do {
        @autoreleasepool {
            CGImageRef image1 = CGDisplayCreateImage(kCGDirectMainDisplay);

            NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:image1];
            NSImage *image = [[NSImage alloc] init];
            [image addRepresentation:bitmapRep];
            _imageView.image = image;
            CGImageRelease(image1);   // release the image
            [NSThread sleepForTimeInterval:1];
        }
    }
    while(true);
}
于 2013-03-25T23:31:54.647 に答える
1

ここではARCを使用していないと想定しています。

自動解放プールの機能を誤解しているようです。それはそれ自身の特権によってオブジェクトを魔法のように解放しません(それがARCの目的です!)。(管理された保持/解放モードで)を使用するか、自動解放するコンビニエンスコンストラクターを使用して、オブジェクトをプールに追加します。オブジェクトautoreleaseが破棄されると、オブジェクトがオブジェクトに追加されるたびに、プールは各オブジェクトを1回解放します。プール。ここでオブジェクトを作成するために使用しているメソッドはalloc、所有するオブジェクトを返すため、オブジェクトの所有権を明示的に解放する必要があります。

ループの一番下に追加するだけです。

[image release];
[bitmapRep release];
CGImageRelease(image1);
于 2013-03-25T23:39:21.760 に答える