swift – 使用大量UIImage时的内存问题
发布时间:2020-12-14 04:55:59 所属栏目:百科 来源:网络整理
导读:我在一个阵列上存储了大约100个UI Image.我知道有一个内存使用问题最终导致应用程序崩溃,特别是在旧设备(iPhone 4s)上.在存储DocumentsDirectory上的所有UIImages的用户体验方面 – 不是一个选项(花费太长时间).所以我在考虑“合并”这两种方法.等到我收到内
我在一个阵列上存储了大约100个UI
Image.我知道有一个内存使用问题最终导致应用程序崩溃,特别是在旧设备(iPhone 4s)上.在存储DocumentsDirectory上的所有UIImages的用户体验方面 – 不是一个选项(花费太长时间).所以我在考虑“合并”这两种方法.等到我收到内存使用警告,停止将图像保存到我的阵列,然后开始存储在磁盘上.我找不到正确的方法来处理内存泄漏/警告/使用调用
override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() print("memory warning") } 当我在真实设备上进行测试时,它只是崩溃 – 没有调用方法.有什么建议? 解决方法
尝试使用图像缓存库.
最受欢迎的比较是: https://bpoplauschi.wordpress.com/2014/03/21/ios-image-caching-sdwebimage-vs-fastimage/ 我的经验:SDWebImage最适合通常来自互联网的URL源图像,而Haneke适用于基于ID的图像,例如从视频生成的缩略图. SDWebImage使用CoreData SQLite DB进行URL缓存.它没有“手工制作”图像的方法,但在从REST下载互联网图像的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]; } “ 这里是创建缓存图像的示例(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; } “ 和使用(表视图单元格中集合的集合视图单元格): “ - (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; } “ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |