NSCache是什么東東贩疙?
NSCache是蘋果提供的一套緩存機制讨永,用法和NSMutableDictionary類似盖溺,在AFNetworking燃辖,SDWebImage,Kingfisher中都有用到踏烙。
NSCache和NSMutableDictionary的區(qū)別
- NSCache是線程安全的师骗,不需要加線程鎖,而NSMutableDictionary線程不安全讨惩。想了線程安全和鎖可以看這篇文章http://blog.csdn.net/Hello_Hwc/article/details/50037505?ref=myread
- 當內(nèi)存不足時NSCache會自動釋放內(nèi)存
- NSCache設置緩存對象數(shù)量和占用的內(nèi)存大小辟癌,當緩存超出了設置會自動釋放內(nèi)存
- NSCache是Key-Value數(shù)據(jù)結構,其中key是強引用荐捻,不實現(xiàn)NSCoping協(xié)議黍少,作為key的對象不會被拷貝
NSCache的屬性
countLimit: 能夠緩存對象的最大數(shù)量,默認值是0处面,沒有限制(限制是不精/不嚴格的)厂置。
totalCostLimit: 設置緩存占用的內(nèi)存大小(限制是不精/不嚴格的)
evictsObjectsWithDiscardedContent: 是否回收廢棄內(nèi)容魂角,默認YES
NSCache的方法
objectForKey: 通過key獲得緩存對象
setObject: forKey: 緩存對象
setObject: forKey: cost: 緩存對象昵济,并指定key值對應的成本,用于計算緩存中所有對象的總成本
removeObjectForKey: 刪除指定對象
removeAllObjects: 刪除所有緩存對象
NSCacheDelegate代理
willEvictObject: 緩存對象即將被清理時調(diào)用野揪,一般開發(fā)者用來調(diào)試访忿,不能在此方法中修改緩存
在下列場景中會被調(diào)用:
- removeObjectForKey
- 緩存對象超過NSCache的countLimit和otalCostLimit屬性設置的限制
- App進入后臺
- 系統(tǒng)發(fā)出內(nèi)存警告
- cache這個實例的生命周期結束前
NSCache需要注意的點
- 當收到內(nèi)存警告,而我們又調(diào)用removeAllObjects斯稳,則無法再繼續(xù)往緩存中添加數(shù)據(jù)
- 不提供緩存總的大小海铆,想知道NSCache占用的內(nèi)存大小,只有通過添加緩存的cost自己計算
- NSCache自動釋放內(nèi)存的算法是不確定的挣惰, 有時是按照LRU(最近最久未使用)釋放卧斟,有時隨機釋放
- NSCache中的數(shù)據(jù)在APP重啟后會消失殴边,因為NSCache只是將數(shù)據(jù)保存在內(nèi)存