我有这样的问题:
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");
我检查了数据是否仍然存在于内存中(我预计它会在我自动释放池消失后删除)但它仍然存在:(。您是否知道如何删除该数据?
答案 0 :(得分:1)
非常感谢你,我测试过,这是真的。这是对我的问题的看法:我在设备中有132张图像(~300 kb / 1图像),现在我的目的是将每2张图像合并为1张大图像(水平方向并排)。这就是我的工作:
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 ;
}
答案 1 :(得分:0)
我假设您在引用的代码之前省略了NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
。
您应该在发送image1
之前释放[pool drain]
,因为您已经分配了data
。 [pool drain]
对象是自动释放的,这意味着它会在data
中释放。但是,释放对象并不会将对象的所有指针神奇地设置为nil,因此NSLog(@"%@", data);
指向已解除分配的对象。只是为了踢,尝试以下而不是最后一行:
{{1}}
您的应用应该在此行崩溃,因为您无法向已解除分配的对象发送消息。