NSCache 原始碼註解

2021-09-11 12:33:59 字數 2025 閱讀 9667

nscache是foundation 框架中用於快取的類(記憶體快取)。其使用方法類似於dictionary。其原始碼實現比較簡單,但是也挺坑人的尤其是totalcostlimitcountlimit屬性。關鍵**處我都加了注釋。

//

// 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...