CGImageRef |内存消耗|泄漏

时间:2013-01-08 15:23:59

标签: objective-c cocoa quartz-graphics cgimageref

我需要捕获桌面图像并处理其RGB数据,我使用Quartz API来做同样的事情,

我面临的问题是,高mem使用率,

请参阅功能

在这里编辑, 这个函数是通过pThread调用的;像这样的东西,

void ImageProcessing::thread(){  
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];  
ImgRef sImageRef  

while( active){  
**strong text**
if ([currentWnd getCurrentRGBImage:&currentImg]){
   /*  do something here */
}

}
[pool release];


}
-(bool)getCurrentRGBImage:(ImgRef *)pImgRef{

    CGImageRef pCGImageRef;
    pCGImageRef = [self getDesktopImage];

    if ( !pCGImageRef ){
        NSLog(@" got NULL Image ");

        CGImageRelease(pCGImageRef);
        pCGImageRef = NULL;

        return NO;
    }

    // Create a bitmap rep from the image...

    size_t width  = CGImageGetWidth(pCGImageRef);
    size_t height = CGImageGetHeight(pCGImageRef);
    int bytesPerRow = CGImageGetBytesPerRow(pCGImageRef);
    int bytesPerPixel = CGImageGetBitsPerPixel(pCGImageRef)/8;

    CGDataProviderRef provider = CGImageGetDataProvider(pCGImageRef);

    CFDataRef pData = CGDataProviderCopyData(provider);
    const uint8_t* bytes = (const uint8_t *)CFDataGetBytePtr(pData);

    /***** ------------- *********

     Copy RAW Bytes to pImgRef

     ****************************/



    CGDataProviderRelease(provider);
    CFRelease(pData);

    CGImageRelease(pCGImageRef);
    pCGImageRef = NULL;

    return YES;

}

和getDesktopImage函数是

-(CGImageRef)getDesktopImage{
    CGImageRef screenShot;


        screenShot = CGWindowListCreateImage(CGRectInfinite, kCGWindowListOptionOnScreenOnly, kCGNullWindowID, kCGWindowImageDefault);

    return screenShot;
}

问题是,总的来说这个功能耗费了大量内存,* pImgRef只有一个实例,只有像素,RGB操作,

内存使用我指的是Mac Activity Monitor,它可靠吗?

文档Documentation for CGDataProviderRelease提到应用程序需要保持保留和释放它,所以我调用CGDAtaProviderRelease但在控制台中获取消息 malloc引用计数下溢,用于中断auto_refcount_underflow_error以进行调试

我不应该调用CGDataProviderRelease()吗?如果我评论我没有得到这个消息,所以不确定,无论是在Quartz中还是在我的代码中的bug,

此外,这个功能正在消耗大量的内存,如果我在Activity监视器中检查,是否可以安全地假设它真的使用了这么多内存?

1 个答案:

答案 0 :(得分:1)

由于您不保留,创建或复制数据提供者,因此不应将其发布。

我没有看到任何会导致内存消耗过多的内容,但是你留下了一些代码。

相关问题