2013-01-08 144 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