CGImageRef | потребление памяти | Утечка

Мне нужно захватить изображение рабочего стола и обработать его данные 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, надежно ли это?

документ Документация для CGDataProviderRelease упоминается, что приложение должно сохранять и освобождать его, поэтому я вызываю CGDAtaProviderRelease, но получаю сообщение в консоли недостаточное значение счетчика ссылок malloc для перерыва в auto_refcount_underflow_error для отладки

Должен ли я не вызывать CGDataProviderRelease()? если я прокомментирую, я не получу это сообщение, поэтому не уверен, является ли это ошибкой в ​​Quartz или в моем коде,

Кроме того, эта функция потребляет чертовски много памяти, если я проверю монитор активности, можно ли предположить, что она действительно использует так много памяти?


person Amitg2k12    schedule 08.01.2013    source источник


Ответы (1)


Поскольку вы не сохраняете, не создаете и не копируете поставщика данных, его не следует освобождать.

Я не вижу ничего, что могло бы привести к избыточному потреблению памяти, но вы не включили часть кода.

person JWWalker    schedule 08.01.2013
comment
код, который я не показал тебе, не является вызовом выделения и освобождения, другое дело, в мониторе активности я отслеживаю использование памяти, поэтому можно с уверенностью предположить, что он показывает фактическое потребление памяти, поэтому я должен использовать какой-то другой инструмент отслеживания - person Amitg2k12; 09.01.2013
comment
я думаю, что выше блок потребляет только память, я просто прокомментировал любой код, который я не показывал, но потребление памяти не изменилось - person Amitg2k12; 09.01.2013
comment
Я бы предложил использовать инструменты с шаблоном Allocations или Leaks для дальнейшего изучения использования памяти. - person JWWalker; 09.01.2013
comment
Да, я сделал это, что удивительно, с использованием инструментов, я не обнаружил большого потребления памяти и использования! , значит ли это, что что-то не так в том, как монитор активности измеряет использование памяти, пугающая часть для конечного пользователя, будет виден только монитор активности. - person Amitg2k12; 10.01.2013
comment
Какие цифры вы видите? Виртуальная память или реальная память? - person JWWalker; 10.01.2013