Мое приложение исчерпывает память. Для разрешения этого я освобождаю два очень больших массива, используемые в функции, которая пишет кадровый буфер в изображение. Метод похож на это:
-(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, NULL);
// 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);
//free(buffer2);
return myImage;
}
Отметьте эти два, названные к свободному (буферному) и свободному (buffer2) в конце там? Они хорошо работают на средстве моделирования iPad, удаляя проблему памяти и позволяя мне генерировать с наглостью. Однако они уничтожают iPad немедленно. Как, в первый раз это выполняет его. Если я удаляю свободное () вызовы, это хорошо работает, просто исчерпывает память после минуты или два. Итак, почему является свободное () вызовом, разрушающим устройство?
Отметьте - это не вызов к свободному (), который явно разрушает устройство, это отказывает позже. Но это, кажется, первопричина/..
РЕДАКТИРОВАНИЕ - Кто-то спросил о том, где оно точно отказывает. Этот поток продолжает возвращать изображение другому объекту, который пишет это в файл. При вызове метода 'UIImageJPEGRepresentation' это генерирует сообщение EXT_BAD_ACCESS. Я предполагаю, что это вызвано тем, что UIImage, который я передаю его для записи в файл, является поврежденным, пустым или что-то еще. Но это только происходит, когда я освобождаю те два буфера.
Я понял бы, была ли память так или иначе связана с UIIMage, но это действительно не должно быть, тем более, что это работает над средством моделирования. Я задался вопросом, ли это до того, как iPad обрабатывает 'свободные' вызовы...
Из чтения документации я полагаю, что CGDataProviderCreateWithData будет только ссылаться на память, на которую указывает buffer2, а не копировать ее. Вы должны сохранять ее выделенной до тех пор, пока изображение не будет освобождено.
Попробуйте это:
static void _glToUIImageRelease (void *info, const void *data, size_t size) { free(data); } -(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
Перво-наперво, вам действительно следует проверить, не удалось ли malloc вернуть NULL
. Однако, если это не решит вашу проблему, используйте отладчик и пошагово просмотрите свою программу, чтобы точно увидеть, где она не работает (или, по крайней мере, получить трассировку стека). По моему опыту, странные сбои, такие как сбой где-то в неожиданных областях, почти всегда являются переполнением буфера, приводящим к повреждению произвольных данных некоторое время назад.
Размер буфера(ов) занижен? Посмотрите на циклы.
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];
}
}
let y == 0 и x == (768*4)-1, индекс буфера2 превышает выделенный размер. Возможно, до этого индекс выходил за пределы диапазона?