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

Posted

技术标签:

【中文标题】Base64 图像的 UICollectionView / TableView 内存分配问题【英文标题】:UICollectionView / TableView Memory Allocation Issue with Base64 images 【发布时间】:2014-07-10 11:49:25 【问题描述】:

我有一个 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。

提前致谢

卡尔。

【问题讨论】:

而不是imageNamed 我会尝试initWithContentsOfFileimageNamed 函数增加了缓存和一些额外的内存管理,并不太适合比较内存使用情况。 感谢您的提示...将代码更改为“initWithContentsOfFile”确实会在我的应用程序中导致相同的内存增长。这给了我别的东西来调查谢谢... 【参考方案1】:

我通过创建一个 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];
    

【讨论】:

以上是关于Base64 图像的 UICollectionView / TableView 内存分配问题的主要内容,如果未能解决你的问题,请参考以下文章

如何将 blob 图像转换为 base64? base64 变量显示为空

base64 的前缀 'data:image/png;base64,' 是不是影响显示图像?

将 base64 图像作为图像发送到 RestApi (MultiPart)

Base64 图像到 gmail

将 Base64 编码的图像写入文件

如何解码base64 fbx嵌入图像