Я создаю очень большой буфер (называемый Буфер2 в коде), используя CGDataProviderRef со следующим кодом:CGDataProvider не освобождает данные на обратный вызов
-(UIImage *) glToUIImage {
NSInteger myDataLength = 768 * 1024 * 4;
// allocate array and read pixels into it.
GLubyte *buffer = (GLubyte *) malloc(myDataLength);
glReadPixels(0, 0, 768, 1024, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
// gl renders "upside down" so swap top to bottom into new array.
// there's gotta be a better way, but this works.
GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
for(int y = 0; y <1024; y++)
{
for(int x = 0; x <768 * 4; x++)
{
buffer2[(1023 - y) * 768 * 4 + x] = buffer[y * 4 * 768 + x];
}
}
// make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer2, myDataLength, &releaseBufferData);
// prep the ingredients
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * 768;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
// make the cgimage
CGImageRef imageRef = CGImageCreate(768, 1024, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
// then make the uiimage from that
UIImage *myImage = [UIImage imageWithCGImage:imageRef];
free(buffer);
//[provider autorelease];
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpaceRef);
CGImageRelease(imageRef);
return myImage;
}
я ожидаю CGProvider позвонить верните метод releaseBufferData, когда это делается с буфером 2, чтобы я мог освободить память, которую он сделал. Код этого метода:
static void releaseBufferData (void *info, const void *data, size_t size){
free(data);
}
Однако, даже если мой метод обратного вызова вызывается, память, что данные (Буфер2) принимает никогда не освобождается, и, следовательно, это приводит к массовым утечкам памяти. Что я делаю не так?
Проблемы, которые загадочно фиксируют себя, являются подклассом проблем, которые вы не можете исправить ... о, хорошо, рад, что это сработало для вас (если бы это работало для меня). – PeterT
Это потому, что, к счастью, так получилось, что malloc и ваш обратный вызов «release» вызывается в том же потоке. Проблема может повториться.Если это так, пропустите обратный вызов и вместо этого используйте «free», а также тот же поток, что и malloc. –