2013-01-08 102 views
0

我需要捕捉桌面图像,并处理其RGB数据,我使用Quartz API做同样的,CGImageRef |内存消耗|泄漏

我面临什么样的问题是,高内存使用,

请参阅功能,

这里编辑, 这个函数通过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,它可靠吗?

中提到的应用需要保持保持和它的释放,所以我打电话CGDAtaProviderRelease但在控制台 malloc的引用计数溢出获取消息对auto_refcount_underflow_error休息调试

如若文件Documentation for CGDataProviderRelease我不要调用CGDataProviderRelease()?如果我评论我没有得到这个消息,所以不知道,不管它在Quartz中的错误还是在我的代码中,如果我在活动监视器中检查,它是否消耗很多内存,是否它在Quartz或我的代码中的错误安全地假设这真的是使用这么多的内存?

回答

1

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

我没有看到任何会导致内存消耗过多的情况,但是您遗留了部分代码。

+0

我没有显示你的代码是没有分配和释放调用,另一件事是,在活动监视器中我正在监视内存使用情况,所以它是安全的假设,它显示实际的内存消耗,所以我应该利用一些其他的跟踪工具 – Amitg2k12

+0

我认为上面的块只消耗内存,我只是评论了我没有显示的任何代码,但没有改变内存消耗 – Amitg2k12

+0

我建议使用仪器,配置或泄漏模板来进一步调查内存使用。 – JWWalker