昨天提到,我們可以使用method來將function儲存到另一個物件來達到物件化的效果,
function存到另一個物件之後,這個物件跟function原本所在的物件就會保持strong reference的關係,
因此只要這個儲存function的物件還存在,原本存著這個function的class就不會被消滅。
另一種情況是weak reference
由於Monkey C是使用Reference Counting的方式來管理記憶體,
只要沒有其他地方引用這個物件,那Monkey C就會消滅它以達到降低記憶體使用量的效果。
從官方的說明有提出一個情境例子如下:
有3個物件A、B、C,
一開始,物件C引用物件A,物件A又引用物件B,物件B又又引用物件A,
後來物件C沒有引用物件A了,情況變成只剩物件A跟物件B互相引用,
尷尬的情況出現了,物件C已經可以被消滅,
但物件A、B,永遠沒辦法消滅,因為他們雙方都被對方引用,被引用的物件不能被消滅。
要解決這個困擾就可以用weak reference,使用weak()
來建立weak reference
var b = a.weak()
這樣B對A就是weak reference的關係,
這樣一來,沒人對A有strong reference,A可以正常被消滅,
沒人引用B,B也可以被消滅了
如果要確認weak refrence的對象有沒有消滅,可使用.stillAlive()
如果要從weak reference改為使用strong reference,可以使用.get()
if (weakReference.stillAlive()) {
var strongReference = weakReference.get();
strongReference.myMethod();
}