ObjectSpace

用来操作所有对象的模块.

模块函数:

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

此时, procself仍在使用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指定为FixnumSymbol的话, 则不会进行任何操作.

返回迭代操作的次数.

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.