我需要捕捉桌面图像,并处理其RGB数据,我使用Quartz API做同样的,CGImageRef |内存消耗|泄漏
我面临什么样的问题是,高内存使用,
请参阅功能,
这里编辑, 这个函数通过pThread调用;这样的事情,
void ImageProcessing::thread(){
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
ImgRef sImageRef
while(active){
**strong text**
if ([currentWnd getCurrentRGBImage:¤tImg]){
/* 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或我的代码中的错误安全地假设这真的是使用这么多的内存?
我没有显示你的代码是没有分配和释放调用,另一件事是,在活动监视器中我正在监视内存使用情况,所以它是安全的假设,它显示实际的内存消耗,所以我应该利用一些其他的跟踪工具 – Amitg2k12
我认为上面的块只消耗内存,我只是评论了我没有显示的任何代码,但没有改变内存消耗 – Amitg2k12
我建议使用仪器,配置或泄漏模板来进一步调查内存使用。 – JWWalker