Roi*_*lia 5 memory memory-management uiimage swift
我UIImage在一个阵列上存储大约100 个.我知道有一个内存使用问题最终导致应用程序崩溃,特别是在旧设备(iPhone 4s)上.在用户体验方面存储所有UIImages内容DocumentsDirectory- 不是一个选项(花费太长时间).所以我在考虑"合并"这两种方法.等到我收到内存使用警告,停止将图像保存到我的阵列,然后开始存储在磁盘上.我找不到正确的处理方式Memory leak/warning/usage call
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
print("memory warning")
}
Run Code Online (Sandbox Code Playgroud)
当我在真实设备上进行测试时,它只是崩溃 - 没有调用方法.有什么建议?
尝试使用图像缓存库。最流行的比较在这里: https://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/
我的经验:SDWebImage 最适合通常来自互联网的 URL 来源图像,而 Haneke 适合基于 ID 的图像,例如从视频生成的缩略图。两者都可以在 CocoaPods 中使用。
SDWebImage 使用 CoreData SQLite DB 进行 URL 缓存。它没有“手工制作”图像的方法,但在从互联网下载图像的〜REST应用程序中流行。我在刚刚发布的 AppStore MyHairDressers 应用程序中使用它。FastCache 使用文件进行 URL 缓存。但它也像 SDWebImage 一样不适合缓存“手工制作”图像。两者都非常适合通过 URL 下载的图像。Haneke 不仅可以通过 URL 来存储图像,还可以通过自定义 ID 来存储图像。但与 FastCache 一样,它需要一些配置。以下是一些配置的代码:
``
HNKCacheFormat *cacheFormatThumbnail = [[HNKCache sharedCache] formats][CACHE_FORMAT_THUMBNAIL];
if (cacheFormatThumbnail == nil)
{
cacheFormatThumbnail = [[HNKCacheFormat alloc] initWithName:CACHE_FORMAT_THUMBNAIL];
cacheFormatThumbnail.size = CGSizeMake(100.0f, 56.0f);
cacheFormatThumbnail.scaleMode = HNKScaleModeAspectFit;
cacheFormatThumbnail.compressionQuality = 0.5f;
cacheFormatThumbnail.diskCapacity = 10 * 1024 * 1024; // 10MB
cacheFormatThumbnail.preloadPolicy = HNKPreloadPolicyLastSession;
[[HNKCache sharedCache] registerFormat:cacheFormatThumbnail];
}
HNKCacheFormat *cacheFormatPhoto = [[HNKCache sharedCache] formats][CACHE_FORMAT_PHOTO];
if (cacheFormatPhoto == nil)
{
cacheFormatPhoto = [[HNKCacheFormat alloc] initWithName:CACHE_FORMAT_PHOTO];
CGFloat scale = [[UIScreen mainScreen] scale];
cacheFormatPhoto.size = CGSizeMake(1280.0f * scale, 720.0f * scale);
cacheFormatPhoto.scaleMode = HNKScaleModeAspectFit;
cacheFormatPhoto.compressionQuality = 0.5f;
cacheFormatPhoto.diskCapacity = 50 * 1024 * 1024; // 50MB
cacheFormatPhoto.preloadPolicy = HNKPreloadPolicyNone;
[[HNKCache sharedCache] registerFormat:cacheFormatPhoto];
}
Run Code Online (Sandbox Code Playgroud)
``
这是创建缓存图像的示例(TableViewCell 包含带有缩略图的 CollectionView):
``
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
VideoCell *cell = (VideoCell *)[super tableView:tableView cellForRowAtIndexPath:indexPath];
VideoAsset *asset = (VideoAsset *)[self.fetchedResultsController objectAtIndexPath:indexPath];
if ([asset thumbnails] == 0)
{
MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:[cell thumbnails]];
hud.removeFromSuperViewOnHide = YES;
[[cell thumbnails] addSubview:hud];
hud.labelText = NSLocalizedString(@"H11",nil);
[hud show:YES];
CGFloat scale = [[UIScreen mainScreen] scale];
CGSize size = CGSizeMake(100.0f * scale, 56.0f *scale);
__weak typeof(cell) weakCell = cell;
[asset generateThumbnails:self->thumbnailsCount offset:self->thumbnailsOffset size:size completion:^(NSArray *thumbnails) {
dispatch_async(dispatch_get_main_queue(), ^{
[hud hide:YES];
});
if ((thumbnails != nil) && ([thumbnails count] > 0))
{
HNKCache *cache = [HNKCache sharedCache];
NSUInteger n = 0;
NSUInteger keyHash = [[[asset assetURL] absoluteString] hash];
for (UIImage *image in thumbnails)
{
[cache setImage:image forKey:[NSString stringWithFormat:@"%lu@%i",(unsigned long)keyHash,(int)(n++)] formatName:CACHE_FORMAT_THUMBNAIL];
dispatch_async(dispatch_get_main_queue(), ^{
if (weakCell != nil)
{
__strong typeof(cell) strongCell = weakCell;
[[strongCell thumbnails] reloadData];
}
});
formatName:CACHE_FORMAT_PHOTO];
}
}
}];
}
return (UITableViewCell *)cell;
}
Run Code Online (Sandbox Code Playgroud)
``
并使用(表视图单元格中集合的集合视图单元格):
``
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
ThumbnailCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
NSString *key = [NSString stringWithFormat:@"%lu@%i",(unsigned long)[[[(VideoAsset *)self->_selectedObject assetURL] absoluteString] hash],(int)[indexPath item]];
[cell setKey:key];
[cell setTag:[indexPath item]];
__weak typeof(cell) weakCell = cell;
[[HNKCache sharedCache] fetchImageForKey:key formatName:CACHE_FORMAT_THUMBNAIL success:^(UIImage *image) {
[[weakCell image] setImage:image];
} failure:^(NSError *error) {
if ([[error domain] isEqualToString:HNKErrorDomain] && ([error code] == HNKErrorImageNotFound))
{
[[weakCell image] setImage:[UIImage imageNamed:@"movieplaceholder"]];
}
else [error reportError];
}];
return cell;
}
Run Code Online (Sandbox Code Playgroud)
``
| 归档时间: |
|
| 查看次数: |
767 次 |
| 最近记录: |