快取部分從這部分開始
operation.cacheoperation = [self.imagecache querydiskcacheforkey:key done:^(uiimage *image, sdimagecachetype cachetype)
if (!key)
首先是一些引數的判斷,必須都要存在。
uiimage *image = [self imagefrommemorycacheforkey:key];
if (image)
這幾句**是先從記憶體中根據key(url)取。
- (uiimage *)imagefrommemorycacheforkey:(nsstring *)key
再看memcache的型別
@property (strong, nonatomic) nscache *memcache;
會發現它記憶體快取用的是nscache,可能一般做一些快取大家就直接用字典了,其實這樣是不對的,首先沒有nscache那麼便於管理,清理記憶體也不方便。
另外,可能大家沒有注意到,memcache並不是普通的nscache,而是作者繼承nscache而實用的autopurgecache.
為什麼要這麼做呢?
看一下這個就知道了,在ios7以後nscache不能在記憶體警告的時候自動清除記憶體,經過我的測試確實是這樣的,所以作者在這裡繼承了乙個nscache,在裡面加入了這樣乙個通知
只要一收到記憶體警告的通知就清空記憶體,這樣就不會因為記憶體問題而崩潰了。
好,下面講如果從記憶體中沒有取到然後做什麼。
nsoperation *operation = [nsoperation new];
dispatch_async(self.ioqueue, ^
@autoreleasepool
dispatch_async(dispatch_get_main_queue(), ^);
}});
再看@autoreleasepool{};
他能夠保證在區域結束時變數能夠馬上被釋放,防止從硬碟將取出之後造成記憶體過高。
下面看從硬碟取出的過程。
- (uiimage *)diskimageforkey:(nsstring *)key
return image;
}else
}
首先取出的nsdata資料,然後根據的格式做相應的操作,比如gif**,會取出陣列,然後用
[images addobject:[uiimage imagewithcgimage:image scale:[uiscreen mainscreen].scale orientation:uiimageorientationup]];
來返回可以動的。除此之外,還有webp型別喝普通型別。
然後還會根據的方向做一定的翻轉。並且對進行解壓(主要是去掉alpha通道,不然系統會自動做這個操作,影響效率)。
然後會計算出最後的大小並放入記憶體中。
以上是取的過程,下面看存的過程。
從網路取回後,會掉用下面的方法,之前還有乙個**方法,可以不實現。
- (void)storeimage:(uiimage *)image recalculatefromimage:(bool)recalculate imagedata:(nsdata *)imagedata forkey:(nsstring *)key todisk:(bool)todisk
// if memory cache is enabled
if (self.shouldcacheimagesinmemory)
if (todisk)
if (imageispng)
else
#else
data = [nsbitmapimagerep representationofimagerepsinarray:image.representations usingtype: nsjpegfiletype properties:nil];
#endif
}[self storeimagedatatodisk:data forkey:key];
});}
}
首先判斷是否需要放入記憶體,如果需要,就放到記憶體中。
然後判斷是否需要放到硬碟中,如果需要:
又把這個過程放入非同步序列佇列中,並且根據的型別把變成二進位制資料存入硬碟中。
後有有乙個地方,可以禁止icloud同步。
// disable icloud backup
if (self.shoulddisableicloud)
AbstractCollection原始碼分析
abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...
ThreadPoolExecutor原始碼閱讀
執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...
OrangePi One Android 原始碼編譯
一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...