用来操作所有对象的模块.
ObjectSpace._id2ref(id)利用对象ID(Object#id)获取对象. 若没有相应的对象则引发RangeError异常.
ObjectSpace.define_finalizer(obj, proc)ObjectSpace.define_finalizer(obj) {|id| ...}注册销毁对象时所要执行的finalizer proc. 若多次针对同一对象调用该函数时, 会进行追加注册而并非替换操作.
通常把Proc对象当做finalizer传给proc. 若使用块的话, 该块就成为proc(但是,正如后文中提到的那样,使用块来注册finalizer是比较困难的)。
obj的ID(Object#id)会被当做参数传递给finalizer proc。
不要像下面这样来使用define_finalizer。
class Foo
def initialize
ObjectSpace.define_finalizer(self) {
puts "foo"
}
end
end
Foo.new
GC.start
此时, proc的self仍在使用obj, 所以该对象不能被GC回收。
[ruby-src:lib/tempfile.rb]堪称演示finalizer用法的优秀范本. 它在类的上下文(context)中生成Proc,巧妙地避开了上面提到的问题.
class Bar
def Bar.callback
proc {
puts "bar"
}
end
def initialize
ObjectSpace.define_finalizer(self, Bar.callback)
end
end
Bar.new
GC.start
在调用proc的过程中,即使发生了大规模退出(non-local exit)的话(exit或异常)也会被忽略. 这主要是为了防止脚本的主处理过程因GC而被非同步中断所采取的措施. 为了以防万一, 最好事先使用-d选项来测试一下是否会发生异常.
class Baz
def initialize
ObjectSpace.define_finalizer self, eval %q{
proc {
raise "baz" rescue puts $!
raise "baz2"
puts "baz3"
}
}, TOPLEVEL_BINDING
end
end
Baz.new
GC.start
# => baz
ObjectSpace.each_object([class_or_module]) {|object| ...}若某对象的kind_of?与class_or_module一致时,就对其进行迭代操作. 若省略参数,则对所有对象进行迭代操作.
若将class_or_module指定为Fixnum或Symbol的话, 则不会进行任何操作.
返回迭代操作的次数.
ObjectSpace.garbage_collect回收那些已作废的对象. 与GC#start相同.
返回nil.
ObjectSpace.undefine_finalizer(obj)取消obj的所有的finalizer.
返回obj.
以下这些是finalizer的以前的接口. 若使用它们的话,会收到警告信息.
ObjectSpace.add_finalizer(proc) ((<obsolete>))将proc设为finalizer.
若销毁call_finalizer所指定的对象时, 将以该对象的ID(c.f Object#id)为参数来调用finalizer.
返回proc.
该方法已经停用(obsolete). 请使用ObjectSpace.define_finalizer.
ObjectSpace.call_finalizer(obj) ((<obsolete>))将obj设为与finalizer相对应的对象.
返回obj.
该方法已经停用(obsolete).
ObjectSpace.finalizers ((<obsolete>))以数组的形式返回当前已注册的finalizer.
该方法已经停用(obsolete).
ObjectSpace.remove_finalizer(proc) ((<obsolete>))从finalizer中删除指定的proc.
返回proc.
该方法已经停用(obsolete). 请使用ObjectSpace.undefine_finalizer.