sdwebimage清除内存缓存
㈠ SDWebImage清理缓存处理
SDWebImage对图片的缓存分两种,一种是缓存到磁盘上,一种是御歼弯缓存在内存中。在加载图片时,首先会从内存中寻找缓存图片,如果没有再从磁盘缓存中寻找,实在没有才会从网络请求图片。既然有缓存,那就免不了对缓存的清理,不然一直缓存不清镇闷理,会导致内存暴涨和磁盘空间的大量占用。
在使用SDWebImage加载图片的时候 其实已经初始化过SDImageCache单例了。在SDImageCache单例里添加了几个通知:
这三个通知分别是在app收到内存警告时清理缓存,在app将要退出时 删除旧的缓存文件,还有在app进入后台后,删除旧的缓存文件。也就是说,默认情况下SDWebImage已经为我们做了一些缓存的清理了。
SDImageCache提供了一个动态控制最大缓存图片像素数量的方法。像素和内存单位不同,下面我设置了最大像素为1000 * 1000 * 30 px 大概相当于几十兆的内存大小。这样我的app里缓存在内存中的的图片大小就会控制在几十兆改碧的范围内。
[SDImageCache sharedImageCache].maxMemoryCost = 1000 * 1000 * 30;
在app回到后台和收到内存警告开始清理图片缓存时,会将磁盘里超过该值的缓存图片清理掉。
下面我设置的为最大50M的缓存空间
[SDImageCache sharedImageCache].config.maxCacheSize = 1024 * 1024 * 50;
㈡ 中高级IOS开发程序员要具备哪些能力和技能
一、数据加密必备技能-密码学
在网络加速发展的时代,数据安全已经是一个必不可少的技术课题。如何让用户数据、网络数据、内容数据安
全可靠,也是每个开发者需要深思并捍卫的。熟练掌握密码学原理,了解 MD5 算法、非对称、对称加密算法底 层实现,以及如何运用到项目开发中。让开发者实力捍卫数据安全!
1.密码的起源历史
2.Base 64 编码格式、散列函数
3.MD5 &加盐、HMAC加密
4.对称加密算法
5.RSA Openssl、数字签名
二、RunLoop
RunLoop是iOS和OS X中非常基础的一个概念,在开发中不常用,在面试中也几乎是都会问到的一个问题.对RunLoop的概念以及底层实现原理,都是我们应该要掌握的,并且要知道在开发中哪些地方可以使用到RunLoop。
1.能理解RunLoop概念
2.知道RunLoop的使用方式
3.RunLoop在开发中的使用
三、Runtime
OC 纵横 iOS 开发已经多年,但是我们真的了解他们?他到底是怎么样的一个底层原理?在使用上难道就真的只有
这样?我们该如何更加掌握这门语言的应用?另外 OC 能做到的 Swift 也能做到吗?
1.runtime 到底是什么
2.runtime 怎么运用
3.runtime 怎么运用
4.siwft 中如何使用runtime
四、SDWebImage源码的分析
在开发中, 为了提高工作的效率, 我们大都会引入很多的框架, 觉得只要能能完成自己的工作达到目的就行, 当然这没错,但是确忽略了很多好框架中的编程思想,和实现的逻辑, 只知道使用框架, 不知道它里面的精髓, 长远来说对我们的发展是不好的, 所以让我们从经典的框架开始学起,一起来学习SDWebImage的精髓.
1.SDWebImage的demo的分析
2.SDWebImage缓存的概念
3.下载超时和图片的格式区分
4.SDWebImage的清理机制和内存的监听
五、H264编码
扎克伯格说“视频是未来facebook社交的最重要的行为之一”。作为开发而言,我们应该了解视频如何做到编码。在直播平台编码的技术也是频频使用,让我们从业务层跨往视频编码底层的第一步。
1.了解直播项目的架构以及技术突破点;
2.视频组成原理
3.H264文件的结构
4.软编码和硬编码的区别以及应用场景
5.硬编码的原理
6.使用硬编码编码视频文件
7.H264解码的多种处理方式
六、AAC编码
直播、音视频项目已经是iOS 应用类的APP的中坚力量。解密音频编码过程,让开发者不在对编码讳莫如深。映客、全名K歌、网易云音乐等等知名APP都会用到的音频AAC编码方式。
1.了解声音从模拟信号到数字信号的原理
2.PCM编码解析
3.AAC编码原理
4.AAC文件的结构
5.音频在软编码FFmpeg 和 硬编码的区别
6.利用硬编码编码音频
7.捕获媒体数据,如何区分音视频数据
8.利用FFmpeg 合成 H264文件和AAC文件到MP4容器中
㈢ ios开发中怎么释放imagenamed这个方法带来的内存缓存
这个类库提供一个UIImageView类别以支持加载来自网络的远程图片。具有缓存管理、异步下载、同一个URL下载次数控制和优化等特征。使用示范的代码:UITableView使用UIImageView+WebCache类(基本应用,UIImageView的一个category)前提#import导入UIImageView+WebCache.h文件,然后在tableview的cellForRowAtIndexPath:方法下:-(UITableViewCell*)tableView:(UITableView*):(NSIndexPath*)indexPath{staticNSString*MyIdentifier=@"MyIdentifier";UITableViewCell*cell=[:MyIdentifier];if(cell==nil){cell=[[UITableViewCellalloc]initWithStyle::MyIdentifier]autorelease];}//:methodtoloadthewebimage[cell.imageViewsetImageWithURL:[NSURLURLWithString:@"/path/to/image.jpg"]placeholderImage:[UIImageimageNamed:@"placeholder.png"];cell.textLabel.text=@"MyText";returncell;}基本代码:[imageViewsetImageWithURL:[NSURLURLWithString:@"/path/image.jpg"];使用SDWebImageManager类:可以进行一些异步加载的工作。SDWebImageManager*manager=[];UIImage*cachedImage=[managerimageWithURL:url];//将需要缓存的图片加载进来if(cachedImage){//如果Cache命中,则直接利用缓存的图片进行有关操作//Usethecachedimageimmediatly}else{//如果Cache没有命中,则去下载指定网络位置的图片,并且给出一个委托方法//Startanasyncdownload[managerdownloadWithURL:urldelegate:self];}当然你的类要实现SDWebImageManagerDelegate协议,并且要实现协议的webImageManager:didFinishWithImage:方法。//当下载完成后,调用回调方法,使下载的图片显示-(void)webImageManager:(SDWebImageManager*):(UIImage*)image{//}独立的异步图像下载可能会单独用到异步图片下载,则一定要用downloaderWithURL:delegate:来建立一个SDWebImageDownloader实例。downloader=[:urldelegate:self];这样SDWebImageDownloaderDelegate协议的方法imageDownloader:didFinishWithImage:被调用时下载会立即开始并完成。独立的异步图像缓存SDImageCache类提供一个创建空缓存的实例,并用方法imageForKey:来寻找当前缓存。UIImage*myCachedImage=[SDImageCachesharedImageCache]imageFromKey:myCacheKey];存储一个图像到缓存是使用方法storeImage:forKey:[SDImageCachesharedImageCache]storeImage:myImageforKey:myCacheKey];默认情况下,图像将被存储在内存缓存和磁盘缓存中。如果仅仅是想内存缓存中,要使用storeImage:forKey:toDisk:方法的第三个参数带一负值来替代。SDWebImage支持异步的图片下载+缓存,提供了UIImageView+WebCacha的category,方便使用。纪录一下SDWebImage加载图片的流程。入口setImageWithURL:placeholderImage:options:会先把placeholderImage显示,然后SDWebImageManager根据URL开始处理图片。进入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给SDImageCache从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:.先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:到SDWebImageManager。SDWebImageManagerDelegate回调webImageManager:didFinishWithImage:到UIImageView+WebCache等前端展示图片。如果内存缓存中没有,生成NSInvocationOperation添加到队列开始从硬盘查找图片是否已经缓存。根据URLKey在硬盘缓存目录下尝试读取图片文件。这一步是在NSOperation进行的操作,所以回主线程进行结果回调notifyDelegate:。如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate回调imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调imageCache:didNotFindImageForKey:userInfo:。共享或重新生成一个下载器SDWebImageDownloader开始下载图片。图片下载由NSURLConnection来做,实现相关delegate来判断图片下载中、下载完成和下载失败。connection:didReceiveData:中利用ImageIO做了按图片下载进度加载效果。connectionDidFinishLoading:数据下载完成后交给SDWebImageDecoder做图片解码处理。图片解码处理在一个NSOperationQueue完成,不会拖慢主线程UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。在主线程:宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo:回调给SDWebImageDownloader。imageDownloader:didFinishWithImage:回调给SDWebImageManager告知图片下载完成。通知所有的downloadDelegates下载完成,回调给需要的地方展示图片。将图片保存到SDImageCache中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独NSInvocationOperation完成,避免拖慢主线程。SDImageCache在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。SDWI也提供了UIButton+WebCache和MKAnnotationView+WebCache,方便使用。SDWebImagePrefetcher可以预先下载图片,方便后续使用。SDWebImage库的作用:通过对UIImageView的类别扩展来实现异步加载替换图片的工作。
㈣ RN 图片框架缓存机制
RN图片框架iOS采用的是SDWebImage, 安卓采用的是Fresco
SDWebImage分为两级缓存,内存缓存和文件缓存,其中文件缓存的策略:
1.默认保存一个星期,优先清理过期的图片
2.清理过期图片后,计算出未过期的缓存大小总和,并与最大的缓存空间的 1/2 作对比;
3.按时间嫌镇最久未被访问(或修改)的顺序,对缓存数据做一个排序;
4.根据排闭者闷序结果继续清理 时间最久远的缓存图片数据,直到剩余的缓存大小 小于最大空间的1/2时,停止清理;
Fresco 分为三级缓存轿弯,bitmap缓存、未解码图片的内存缓存和磁盘缓存, 缓存策略:
内存缓存默认5分钟,超过两个小时加载的图片就更新到磁盘缓存
磁盘缓存设有缓存上限,根据图片占用的磁盘大小来的,高端机型是40M,中端10M,低端2M
没有固定的清理时间,而是按访问时间从远到近来清理
㈤ 谈一谈NSCache
NSCache介绍
NSCache是苹果提供的一套缓存机制,与NSMutableDictionary可变字典的用法类似,常见于一些第三方库,比如AFNetworking,SDWebImage。
使用场景:通常用使用缓存来临时存储短时间使用但创建昂贵的对象,优化性能,避免这些对象的多次创建 。
NSCache和NSMutableDictionary的区别
1、NSCache是线程安全的,不需要加线程锁,而NSMutableDictionary线程不安全州神,多线程访问和操作,需要我们自己设置管理。
2、NSCache的内存由系统管理,当内存不足时,NSCache会自动释放内存。
3、NSCache可以设置缓存对象数量和占用的内存大小,当缓存超出了设置,会自动释放内存。
4、NSCache是Key-Value的数据结构,其中key是强引用,不实现NSCoping协议,作为key的对象不会被拷贝。
下面介绍NSCache的属性、方法、代理
属性
countLimit: 能够缓存对象的最大数量,默认值是0,没有限制(限制是不精/不严格的)。 totalCostLimit: 设置缓存占用的内存大小(限制是不精/不启迹猜严格的)。
: 是否回收废弃内容,默认YES。
方法
setObject: forKey: 缓存对象。
setObject: forKey: cost: 缓存对象,并指定key值对应的成本,用于计算缓存中所有对象的总成本。
objectForKey: 通过key获得缓存对象。
removeObjectForKey: 删除指定对象removeAllObjects: 删除所有缓存对象
代理(NSCacheDelegate)
willEvictObject: 缓存对象即将被清理时调用,一般开发者用来调试,不能在此方法中修改缓存
以下场景会被调用:
1、 removeObjectForKey
2、缓存对象超过NSCache的countLimit和otalCostLimit属性设置的限制
3、App进入后台
4、系统发出内存警告
5、cache这个实例的生命周期结束前
NSCache注意点
1、当收到内存警告,而我们又调用removeAllObjects,则无法再继续往缓存中添加数据。
-(void)didReceiveMemoryWarning{
[super didReceiveMemoryWarning];
// 当收到内存警告,在悄型这里清除缓存
[self.cache removeAllObjects];
// 如果再继续添加数据的话 会直接被删除
}
2、不提供缓存总的大小,想知道NSCache占用的内存大小,只有通过添加缓存的cost自己计算。
3、NSCache自动释放内存的算法是不确定的, 有时是按照LRU(最近最久未使用)释放,有时随机释放。
4、NSCache中的数据在APP重启后会消失,因为NSCache只是将数据保存在内存。
㈥ iOS面试题:简单的描述一下 SDWebImage的缓存策略
首先, SDWebImage 的图片缓存采用的是 Memory (内存) 和 Disk (硬盘) 双重 Cache 机制, SDImageCache 中有一个叫做 memCache 的属性,它是一个 NSCache 对象,用于实现我们对滑腔圆图片的 Memory Cache ,其实就是接受系统的内存警告通知,然后清除掉自身的图片缓存。 Disk Cache ,也就是文件缓存, SDWebImage 会将图片存放到 NSCachesDirectory 目录中,然后为每一个缓存文圆码件生成一个 md5 文件名信塌, 存放到文件中。 整体机制如下:
原文地址
㈦ 如何获取图像缓存,并将 SDWebImage 的文件系统路径
我使用SDWebImage的图像在UICollectionView中我的 iOS 应用程序的缓存。
一切都很好,但是当用户滚动快速的集合视图有总是小暂停之前占位符将被替换缓存的图像。我相信这是因为缓存中检查。为更好的用户体验,我想要显示正确冲脊的图像,而不是占位符,一旦图像实际上的高速缓存的单元格。如果我能得到的缓存的图像 (设备) 本地文件系统路径并将它存储在该显示的实例,并使用它,这将很容易 (如果存在) 而不是我的占位符。
然而它获取的唯一论据是UIImage实例 (实际上也有BOOL变量称为缓存太正在传递的主分支) 中有向传递给setImageWithURL方法成功块的可能性。所以-有没有可能直接从UIImage实例腔派获取图像的文件系统路径?或我应该修改SDWebImage所以它传递散圆渗的信息