imageWithCGImage не выпускается или перехватывается Cache, подобным imageNamed, есть ли способ создания динамических изображений? - PullRequest
1 голос
/ 16 июля 2011

Я генерирую UIImage с помощью набора битов, создавая их на лету и меняя изображение UIImageView.Есть ли способ отредактировать изображение UIImageView напрямую?(т.е. изменить цвет определенного пикселя, не удаляя UIImage из UIImageView, и заставить его перерисовать.)

В настоящее время я сбрасываю UIImage и использую imageWithCGIImage, чтобы создать новый, иприсвоение его UIImageView.Это работает.Показывает нет MemLeaks.Но на iPhone (3Gs) после примерно 100 замен изображений, АВАРИЙ.Кеш, не проблема?Суммирование памяти, кажется, достигает предела телефона, если кэш не освобождается, однако Simulator не показывает потребление памяти при каждом обмене изображениями.Сохраняет плоскую форму без утечек.

Примечание. Массив topologyImage является блоком пикселей RGBA.Переменные REF не освобождаются.Каждая попытка сделать это вылетает при следующем вызове.Без, Instruments не сообщает об утечках.

=========

CGColorSpaceRef colorSpaceRef=CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaLast;
CGColorRenderingIntent renderingIntent=kCGRenderingIntentDefault;
CGDataProviderRef provider=CGDataProviderCreateWithData(NULL,topologyImage,(I*I*4),NULL);
CGImageRef imageRef=CGImageCreate(I,I,8,4*8,4*I,colorSpaceRef,bitmapInfo,provider,NULL,false,renderingIntent);

UIImage *img=[UIImage imageWithCGImage:imageRef];
if( IMG[NDXtopo].vw ) {
    [IMG[NDXtopo].vw setImage:img];
    }
else {
    IMG[NDXtopo].vw=[[UIImageView alloc] initWithImage:img];
    [master.view addSubview:IMG[NDXtopo].vw];
    }

1 Ответ

1 голос
/ 16 июля 2011

В основном вы должны освободить свои ссылки, особенно CGImageRef, поскольку imageWithCGImage не берет на себя ответственность за CGImage, а скорее копирует данные внутри.

Документы по этому вопросу довольно неясны, но из чегоЯ обнаружил в своем тестировании, что если я не выпущу CGImageRefs и CGDataProviderRefs, это в конечном итоге приведет к тому, что приложение получит предупреждения о памяти ... и затем произойдет сбой.

Не уверен, почему у вас произошел сбой, но при выполнениибыстрый тест с:

UIImageView *view = [[UIImageView alloc] init];
int I = 128;
unsigned char *topologyImage = malloc(I*I*4*sizeof(unsigned char));

for(int i=0; i<I*I*4; i++)
{
  topologyImage[i] = 100;
}

for(int i=0; i<1000; i++)
{
    CGColorSpaceRef colorSpaceRef=CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaLast;
    CGColorRenderingIntent renderingIntent=kCGRenderingIntentDefault;
    CGDataProviderRef provider=CGDataProviderCreateWithData(NULL,topologyImage,(I*I*4),NULL);
    CGImageRef imageRef=CGImageCreate(I,I,8,4*8,4*I,colorSpaceRef,bitmapInfo,provider,NULL,false,renderingIntent);
    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(provider);

    UIImage *img=[UIImage imageWithCGImage:imageRef];
    view.image = img;
    CGImageRelease(imageRef);
}
free(topologyimage);

Мне кажется, что это нормально работает, так что все, что вызывает ваш сбой, похоже, происходит из-за чего-то вне вашего примера, например, как вы загрузили данные изображения вtopologyImage

...