3

我正在创建一个应用程序来从 iphone 进行屏幕截图。所以在我完成编码后,我使用分析和分析来检查内存泄漏。我在代码的一个部分中只有一个内存泄漏。这是我的代码,它给了我内存泄漏。

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

我不确定您拥有的其余代码,但通常当其中有一个以 Crete 作为单词的调用时,它必须有相应的发布声明。请检查上面的文档。

CVPixelBufferRelease

释放像素缓冲区。

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