对象引用和引用计数

对象存活期的基本规则是非常简单的:当对某个对象的最后引用被释放时,该对象就被撤消。不过,伴随如此长的存活期,简单并不总意味着容易。

随着使用更多对象,并保存了更多包含对那些对象引用的变量的时候,那么,可能要经历这样一些时期,那时,要撤消自己的对象,而且觉得应能撤消时,实际上却又不可能撤消。

在某个点上,应当能想到,Visual Basic 必须记录对象引用—否则它怎么能知道对象的最后引用何时释放呢?可能开始意识到了:如果只有自己能对 Visual Basic 的引用计数进行访问,那么调试将变得非常容易。

不幸的是,事实并非如此。为了更有效地使用对象,部件对象模型 (COM) 对其引用计数的规则指定了许多复杂的快捷方式。所造成的后果是让人不能信赖引用计数的值—即使已经得到了它。

根据 COM 规则,可以信赖的信息仅为,引用值是否为 0。可以知道什么时候该引用值到达 0,因为对象的 Terminate 事件出现了。除了那个以外,从引用计数中就再也搜集不到任何可靠的信息了。

注意   不记住 COM 引用计数的规则并非一件小事情。自己管理引用计数,比起记录程序中包含对象引用的对象变量来,更加困难。

提示   将对象变量声明为类类型,而非对象。这样的话,是否还有没有终止的 Widget 对象,所需要担心的变量仅仅是那些声明为 As Widget 的变量。

对于对象引用的集合来说,不要使用该 Visual Basic Collection 对象本身。在一个 Visual Basic Collection 对象中,对象的引用是存储在 Variants 中的—它声明为 As Object 的变量一样,可以保存对任何类对象的引用。正确做法是:创建自己的接受唯一类对象的集合类,就象在“创建自己的集合类”中所描述的那样。这样,为了找到 Widget 对象,所需要搜索的集合仅仅是那些 Widget 类型的集合。

把对象组织成分层结构,就象在“对象模型”中所描述的那样。如果所有对象都能连接起来,那么写一个穿过整个模型并报告现存所有对象的过程,是一件很容易的事。

不要将变量声明为 As New。它们就象吹灭后会重新点燃的生日蜡烛一样:如果在将它设置为 Nothing 后又使用,那么 Visual Basic 会强制性地创建另一个对象。

详细信息   循环引用对于利落地关闭来说,是最麻烦的一种情况。请参阅“对象模型”。