nscache是foundation 框架中用於快取的類(記憶體快取)。其使用方法類似於dictionary。其原始碼實現比較簡單,但是也挺坑人的尤其是totalcostlimit
和countlimit
屬性。關鍵**處我都加了注釋。
//
// cache.swift
//
//// created by nigel.he on 16/11/17.
////
//// nscache 中儲存的實體
import foundation
class nscacheentry
}open class nscache: nsobject
open weak var delegate: nscachedelegate?
// 根據key取value
open func object(forkey key: keytype) -> objecttype?
_lock.unlock()
return object
}//使用key做標示,快取value. 預設cost=0
open func setobject(_ obj: objecttype, forkey key: keytype)
//設定快取,並為每個節點設定乙個cost。
open func setobject(_ obj: objecttype, forkey key: keytype, cost g: int)
var purgecount = 0
if countlimit > 0
//這裡就非常有意思了,因為只有_entries[keyref] 存在值時才會建立鍊錶,否則是不會建立出鍊錶結構。
//這裡就是萬惡之源呀。沒有正確的鍊錶,totalcostlimit,countlimit的行為就會受到影響。,也就導致了countlimit和totalcostlimit限制不精確,不嚴格。
//我只想說,這樣也可以!!!算七八糟呀!
iflet entry = _entries[keyref]
} else
_lock.unlock()
// 針對totalcostlimit,移除一些節點。 整理準確執行的先決條件是 建立出準確的鍊錶
var toremove = [nscacheentry]()
if purgeamount > 0 else
}if countlimit > 0
_lock.unlock()
}//針對countlimit,移除一些節點。 整理準確執行的先決條件是 建立出準確的鍊錶
if purgecount > 0 else
}_lock.unlock()
}//通知**刪除了節點
iflet del = delegate
}_lock.lock()
//在字典中移除節點
for entry in toremove
_lock.unlock()
}//產生雙向的鍊錶。 鍊錶的頭節點cost值最小,尾節點cost值最大
private func insert(_ entry: nscacheentry) else
element = e.nextbycost}}
}//根據key, 刪除乙個節點
open func removeobject(forkey key: anyobject)
_lock.unlock()
}//刪除乙個節點
private func remove(_ entry: nscacheentry)
}//刪除全部
open func removeallobjects
() }
public protocol nscachedelegate : nsobjectprotocol
extension nscachedelegate
}複製**
HashMap原始碼註解tableSizeFor
原始碼 這裡只討論n不等於0的情況。第一次右移 n n 1 由於n不等於0,則n的二進位制表示中總會有一bit為1,這時考慮最高位的1。通過無符號右移1位,則將最高位的1右移了1位,再做或操作,使得n的二進位制表示中與最高位的1緊鄰的右邊一位也為1,如000011 第二次右移 n n 2 注意,這個...
dubbo原始碼之Adaptive註解
一 原始碼 documented retention retentionpolicy.runtime target public inte ce adaptive 二 adaptive相關類的載入 呼叫extensionloader類的loadfile 掃瞄介面實現類時,如果類上有adaptive ...
SpringBoot部分註解原始碼說明
目錄 這就是為什麼學習springboot較難的原因,註解裡巢狀著多個註解,解讀這三個註解就是學習的關鍵。從字面上的意思就能讀出來,這個註解是springboot專案配置註解,裡面包含了基本的springboot配置。ctrl 左鍵來看看原始碼。可以看見這個 springbootconfigurat...