【问题标题】:CGImageRef | Memory Consumption | LeakCGImageRef |内存消耗 |泄漏
【发布时间】:2013-01-08 15:23:58
【问题描述】:

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

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

请参考功能,

在此处编辑, 这个函数通过 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 但在控制台中收到消息 在 auto_refcount_underflow_error 上中断的 malloc 引用计数下溢进行调试

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

另外,这个函数正在消耗大量内存,如果我检查活动监视器,假设它真的在使用这么多内存是否安全?

【问题讨论】:

    标签: objective-c cocoa quartz-graphics cgimageref


    【解决方案1】:

    由于您不保留、创建或复制数据提供者,因此不应释放它。

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

    【讨论】:

    • 我没有向你展示的代码是没有分配和释放调用,另一件事是,在活动监视器中我正在监视内存使用情况,所以可以安全地假设它显示实际内存消费,所以我应该使用其他一些跟踪工具
    • 我认为上面的块只消耗内存,我只是注释了我没有显示的任何代码,但内存消耗没有变化
    • 我建议使用带有分配或泄漏模板的 Instruments 来进一步调查内存使用情况。
    • 是的,我做到了,令人惊讶的是,使用仪器,我也没有发现太多的内存消耗和使用! , 那么这是否意味着 Activity 监视器测量 mem 使用情况的方式有问题,可怕的部分是最终用户,只有 Activity 监视器是可见的。
    • 你看到了什么数字?虚拟内存还是真实内存?
    猜你喜欢
    • 2011-06-01
    • 2010-12-23
    • 1970-01-01
    • 2018-03-01
    • 2014-01-04
    • 2021-12-25
    • 2014-03-24
    • 2023-03-23
    • 2015-07-25
    相关资源
    最近更新 更多