使用UIImagePNGRepresentation时的内存问题

时间:2012-01-30 10:34:54

标签: memory uiimage uiimagepngrepresentation

嗨大家我发现这个模块很麻烦。我从Photolibrary导入了100多个图像,将它们保存在具有不同名称的文档目录中。正如所料,我在不寻常的地方遇到了记忆问题。似乎UIImagePNGRepresenation是缓存文件。因此,当我为300多个图像运行以下过程时,我看到3.00 GB范围内的“总字节数”和由于内存而崩溃(在分配工具中测试)。我已粘贴下面的代码。这个代码有什么替代方法

-(void)something
{
   NSData *data=nil;
   for (int i=0; i<numberOfImages; i++) {

    @autoreleasepool {

        UIImage *image=[UIImage imageNamed:[NSString stringWithFormat:@"image%d.png",i]];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *documentsDirectory = [[paths objectAtIndex:0] stringByAppendingString:@"directoryname"];

        NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"image%d.png",i]];

        //convert image into .png format
        data=UIImagePNGRepresentation(image);
        [data writeToURL:[NSURL URLWithString:fullPath] atomically:NO];
      }
   }
   data=nil;
}

3 个答案:

答案 0 :(得分:2)

我通过发送4通道图像(RGBA或RGBX)而不是3通道图像(RGB)解决了这个问题。

您可以检查是否有机会更改图片参数。

答案 1 :(得分:1)

缓存来自[UIImage imageNamed:],而不是UIImagePNGRepresentation()。这样做:

NSString *imageName = [NSString stringWithFormat:@"image%d.png", i];
NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName];
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];

...

答案 2 :(得分:1)

我将此问题邮寄给Apple,他们让我在每次分配之间引入睡眠周期。在分配之前添加睡眠。