3

iPhoneから画面キャプチャするアプリを作成しています。そのため、コーディングを行った後、プロファイリングと分析を使用してメモリ リークをチェックしました。コードの 1 つのセクションでメモリ リークが 1 つだけ発生しています。これがメモリリークを引き起こす私のコードです。

-(void) writeSample: (NSTimer*) _timer {

if (assetWriterInput.readyForMoreMediaData) {
    // CMSampleBufferRef sample = nil;

    CVReturn cvErr = kCVReturnSuccess;

    // get screenshot image!
    CGImageRef image = (CGImageRef) [[self screenshot] CGImage];
    NSLog (@"made screenshot");

    // prepare the pixel buffer
    CVPixelBufferRef pixelBuffer = NULL;
    CFDataRef imageData= CGDataProviderCopyData(CGImageGetDataProvider(image));
    NSLog (@"copied image data");
    cvErr = CVPixelBufferCreateWithBytes(kCFAllocatorDefault,
                                         FRAME_WIDTH,
                                         FRAME_HEIGHT,
                                         kCVPixelFormatType_32BGRA,
                                         (void*)CFDataGetBytePtr(imageData),
                                         CGImageGetBytesPerRow(image),
                                         NULL,
                                         NULL,
                                         NULL,
                                         &pixelBuffer);
    NSLog (@"CVPixelBufferCreateWithBytes returned %d", cvErr);

    // calculate the time
    CFAbsoluteTime thisFrameWallClockTime = CFAbsoluteTimeGetCurrent();
    CFTimeInterval elapsedTime = thisFrameWallClockTime - firstFrameWallClockTime;
    NSLog (@"elapsedTime: %f", elapsedTime);
    CMTime presentationTime =  CMTimeMake (elapsedTime * TIME_SCALE, TIME_SCALE);

    // write the sample
    BOOL appended = [assetWriterPixelBufferAdaptor appendPixelBuffer:pixelBuffer withPresentationTime:presentationTime];

    if (appended) {
        NSLog (@"appended sample at time %lf", CMTimeGetSeconds(presentationTime));
    } else {
        NSLog (@"failed to append");
        [self stopRecording];
        self.startStopButton.selected = NO;
    }
  }
}

「imageData」に格納されているオブジェクトの潜在的なリークが発生しています。上記のコードでエラーを見つけるのを手伝ってくれる人はいますか。メモリ管理ツールでもチェックすると、上記のコードにメモリリークがあります。誰かが私を助けることができれば、それは大きな助けになるでしょう。

前もって感謝します !!

4

2 に答える 2

4

コメントから -

あなたがそれCFReleaseを終えたらimageData、あなたのことをしますか?

直前でも直後でも構いませんNSLog (@"CVPixelBufferCreateWithBytes returned %d", cvErr);

CFRelease(imageData);
于 2012-11-07T05:05:48.170 に答える
0

http://developer.apple.com/library/mac/#documentation/QuartzCore/Reference/CVPixelBufferRef/Reference/reference.html

あなたが持っている残りのコードについてはわかりませんが、一般に、単語としてクレタ島を含む呼び出しがある場合、対応するリリースステートメントが必要です。上記のドキュメントを確認してください。

CVPixelBufferRelease

ピクセル バッファを解放します。

void CVPixelBufferRelease (
   CVPixelBufferRef texture
);
于 2012-11-06T14:23:37.413 に答える