2011-02-01 41 views
2

我已經閱讀了斷開實例變量的任何引用之後在未確定時間發生GC的註釋,但delete方法中的第二行是愚蠢的,不必要的還是徹底的?在Ruby中移除一個類實例?

class MyClass 
    # new instances added to @@instances 
    ... 
    def delete 
    @@instances.delete(self) 
    self.instance_variables.each{|v| self.instance_variable_set(v,nil)} 
    end 

end 
+1

第二行是一條評論。評論總是愚蠢和不必要的。 – 2011-02-01 18:53:57

+0

我會編輯以使其更清楚。歡迎! – 2011-02-01 19:00:19

回答

1

方法delete執行在正在從@@instances結構中除去的實例的範圍,因此它不能垃圾收集。一些東西觸發了該方法的運行,並且某些東西當前持有對它的引用,因此只有在方法返回(並且對象的引用已清除)之後才能進行垃圾回收。

這就是說,第二行是完全沒有必要的。即使其中一個實例變量指向對象本身,GC也足夠聰明,可以解決這個問題(或者說,它只是忽略它,因爲它不是reference counting collector)。

不要試圖手動管理內存,它不會得到回報。無論您是否清除對這些實例變量中對象的引用,GC都會決定何時將它們釋放。如果我正確解釋了代碼示例的想法,則在運行delete之後,將清除對主機對象的所有引用,在這種情況下,是否也清除其實例變量也無關緊要,則對象將符合垃圾回收的條件無論哪種方式。對象在不再可達時就被GC化了,如果其他不可達對象具有對它們的引用,則無關緊要。

相關問題