我需要捕捉桌面圖像,並處理其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