Как освободить данные, сгенерированные UIImageJPEGRepresentation или UIImagePNGRepresentation?
У меня такая проблема:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSData *data;
NSString *file1 = [[NSBundle mainBundle] pathForResource:
[NSStringstringWithFormat:@"originimg_%d.jpg",i] ofType:nil]] ;
UIImage *image1 = [[UIImage alloc]initWithContentsOfFile:file1];
data = UIImageJPEGRepresentation(image, 0.7);
// do sth with data ...
[image1 release];
image1 = nil;
[pool drain];
pool = nil;
if(data)
NSLog(@"still exist");
Я проверил, существуют ли данные в памяти (я ожидал, что они будут удалены после того, как я истощу пул авто-релиза), но они все еще существовали:(. У вас есть идея, как удалить эти данные?
2 ответа
Действительно спасибо, я проверил, и это правда. Это из-за моих проблем: у меня в устройстве 132 изображения (~300 кб / 1 изображение), теперь моя цель - объединить каждые 2 изображения в одно большое изображение (бок о бок в горизонтальной ориентации). Вот что я делаю:
int index = 1;
for(int i = 1;i <= 132;i++)
{
if(i % 2 == 0 && i > 1)
{
NSString *file = [NSString stringWithFormat:@"%@img_%d.jpg",path2,index];
NSLog(@"index %d",index);
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSData *data;
NSString *filename1 = [NSString stringWithFormat:@"originimg_%d.jpg",i];
NSString *filename2 = [NSString stringWithFormat:@"originimg_%d.jpg",i + 1];
NSString *file1 = [[NSBundle mainBundle] pathForResource:filename1 ofType:nil];
NSString *file2 = [[NSBundle mainBundle] pathForResource:filename2 ofType:nil];
UIImage *image1 = [[UIImage alloc]initWithContentsOfFile:file1];
UIImage *image2 = [[UIImage alloc]initWithContentsOfFile:file2];
UIImage *image = [self combineImages:image1 toImage:image2];
data = UIImageJPEGRepresentation(image, 0.7);
[data writeToFile:file atomically:NO];
[image1 release];
image1 = nil;
[image2 release];
image2 = nil;
[pool drain];
pool = nil;
[file release];
file = nil;
index++;
}
}
и функция для объединения 2 изображений
-(UIImage *)combineImages:(UIImage *)image1 toImage:(UIImage *)image2
{
CGSize size;
size= CGSizeMake(768 * 2, 1024);
UIGraphicsBeginImageContext(size);
// Draw image1
[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];
// Draw image2
[image2 drawInRect:CGRectMake(image1.size.width, 0, image2.size.width, image2.size.height)];
UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resultingImage ;
}
- Это мой путь, но когда я работаю на инструментах (распределение), для этого требуется 303,4 МБ:( . Можете ли вы предложить мне лучший способ?
Я полагаю, вы пропустили NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
перед цитируемым кодом.
Вы должны выпустить image1
перед отправкой [pool drain]
потому что ты выделил это. data
объект автоматически освобожден, что означает, что он освобождается в [pool drain]
, Тем не менее, освобождение объекта не волшебным образом устанавливает все указатели на объект равными нулю, поэтому data
указывает на освобожденный объект. Просто для удовольствия попробуйте следующее вместо последней строки:
NSLog(@"%@", data);
Ваше приложение должно аварийно завершить работу в этой строке, потому что вы не можете отправлять сообщения освобожденным объектам.