使用Base64图像的UICollectionView / TableView内存分配问题

时间:2014-07-10 11:49:26

标签: objective-c uitableview memory-management uiimage uicollectionview

我有一个UICollectionView / UITableView显示图像,当我滚动图像时,内存分配逐渐增长并最终导致我的设备崩溃。

要为UICollectionView / UITableView创建我的对象,我有一个构建器类,我从JSON生成对象(此JSON中包含的是图像的Base64字符串)。创建这些对象后,我将它们放入NSArray,然后将它们传递给UICollectionView / UITableView。

内存分配问题发生在(在构建器类中)我从Base64创建UIImage时:

NSData *dataFromString = [[NSData alloc] initWithBase64EncodedString:base64 options:0];
UIImage *image         = [[UIImage alloc]initWithData:dataFromString];

但是如果我从png / jpg创建我的UIImage(再次在构建器类中)我没有问题(即内存分配不会增长):

UIImage *image = [UIImage imageNamed:@"image.png"];

我使用了仪器,似乎没有内存泄漏,当我解雇UICollectionView / UITableView时,内存占用量下降,但我不知道为什么差异似乎是使用Base64。

提前致谢

卡尔。

1 个答案:

答案 0 :(得分:0)

我通过创建tempFileManger类解决了这个问题,然后我将UIImages写为临时目录为PNG:

 NSString *path = [tempDir stringByAppendingPathComponent:imageObject.title];
 NSData *data   = UIImagePNGRepresentation(imageObject.image);

然后在我的cellForItemAtIndexPath方法中,我使用以下方法检索:

NSString *path = [tempDir stringByAppendingPathComponent:imageObject.title];
UIImage *image = [UIImage imageWithContentsOfFile:path];

完成图像使用后,我使用tempFileManagerClass删除了临时文件夹中的所有图像。

   NSArray *contents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:tempDir error:nil];

    for (NSString *filename in contents)  {
        [[NSFileManager defaultManager] removeItemAtPath:[tempDir stringByAppendingPathComponent:filename] error:NULL];
    }