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
我会尝试initWithContentsOfFile
。 imageNamed
函数增加了缓存和一些额外的内存管理,并不太适合比较内存使用情况。
感谢您的提示...将代码更改为“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,' 是不是影响显示图像?