Project1

标题: 如果变量=nil的话,是否就释放了? [打印本页]

作者: DeathKing    时间: 2009-12-29 23:50
标题: 如果变量=nil的话,是否就释放了?
本帖最后由 DeathKing 于 2009-12-30 12:52 编辑

真是个小白问题{:nm_3:}

我就是想问一下,如果我之前有个非nil变量(也就是占用了一些内存),如果我让 var=nil 的话,是否是将这个变量释放?然后把变量所占用的内存也给释放了?
作者: 精灵使者    时间: 2009-12-30 00:50
变量的内存会通过自动回收系统自动释放,可以不用担心这个。
作者: 神思    时间: 2009-12-30 02:55
如果一个变量失去了索引就会被GC回收....
= =但是

a = Sprite.new
b = a
a = nil
这个时候那个Sprite依然是存在的。。。。。
作者: 紫苏    时间: 2009-12-30 04:03
准确地说,不是让变量释放了,而是让变量指向的对象释放了,所谓释放也就是把变量指向的对象所占用的内存释放了~ 变量 = nil 会让该变量重新指向 nil 这个 NilClass 的单一实例,这也是为了让某对象被垃圾回收时的普遍做法,其实完全也可以给变量赋一个其它任意值,这样之前仅仅被这个变量引用的对象就会在适当的时机被回收……另外借楼提一个以前测试时无意发现的诡异现象:

  1. class Sprite
  2.   alias initialize_old initialize
  3. #  def initialize(viewport = nil)
  4. #    initialize_old
  5. #  end
  6. end

  7. s = Sprite.new
  8. s.bitmap = RPG::Cache.battler("001-Fighter01", 0)
  9. s.z = 99999999
  10. s = nil
  11. GC.start
复制代码
直接运行一切正常,Sprite 被顺利回收;一旦把重定义 Sprite 的 initialize 那段注释取消后,Sprite 就一直没有被回收 =v= 后经测试发现问题只出现在 Sprite 这一个类型上,推测是在重定义后某处被某邪恶的东西引用到了……
作者: DeathKing    时间: 2009-12-30 12:52
明白了……
真是谢谢各位大大了{:nm_4:}。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1