查看: 1614|回复: 4

[已经解决] 如果变量=nil的话,是否就释放了?

  [复制链接]
梦石
0
星屑
1580
在线时间
1564 小时
注册时间
2008-7-30
回帖
4207

贵宾

发表于 2009-12-29 23:50:42 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 DeathKing 于 2009-12-30 12:52 编辑

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

我就是想问一下,如果我之前有个非nil变量(也就是占用了一些内存),如果我让 var=nil 的话,是否是将这个变量释放?然后把变量所占用的内存也给释放了?

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更

精灵族の天使<

梦石
0
星屑
1712
在线时间
3039 小时
注册时间
2007-3-16
回帖
33092

开拓者贵宾

发表于 2009-12-30 00:50:09 | 显示全部楼层
变量的内存会通过自动回收系统自动释放,可以不用担心这个。
回复

使用道具 举报

彩色的银子

梦石
0
星屑
50
在线时间
190 小时
注册时间
2006-6-13
回帖
1260

贵宾

发表于 2009-12-30 02:55:13 | 显示全部楼层
如果一个变量失去了索引就会被GC回收....
= =但是

a = Sprite.new
b = a
a = nil
这个时候那个Sprite依然是存在的。。。。。
-.-
回复

使用道具 举报

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2009-12-30 04:03:47 | 显示全部楼层
准确地说,不是让变量释放了,而是让变量指向的对象释放了,所谓释放也就是把变量指向的对象所占用的内存释放了~ 变量 = 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 这一个类型上,推测是在重定义后某处被某邪恶的东西引用到了……
回复

使用道具 举报

梦石
0
星屑
1580
在线时间
1564 小时
注册时间
2008-7-30
回帖
4207

贵宾

 楼主| 发表于 2009-12-30 12:52:57 | 显示全部楼层
明白了……
真是谢谢各位大大了{:nm_4:}。

See FScript Here:https://github.com/DeathKing/fscript
潜心编写URG3中。
所有对URG3的疑问和勘误或者建议,请移步至发布页面。
欢迎萌妹纸催更
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部