10

我正在使用一个TableLayoutPanel动态填充 other 的TablelayoutPanels.

现在我想知道当我调用TableLayoutPanel.Controls.Clear动态填充时会发生什么TableLayoutPanel。显然,所有的子布局都被删除了,但是他们的孩子呢?它们是否也被妥善处理,还是我需要担心内存泄漏?

我应该在调用之前递归删除孩子的孩子Clear()吗?

4

2 回答 2

17

Clear不会释放控件,从而导致内存泄漏。从链接:

调用 Clear 方法不会从内存中删除控制句柄。您必须显式调用 Dispose 方法以避免内存泄漏。

由于在循环中处理会弄乱索引,因此您可以将控件集合复制到另一个列表并对其执行ForEach循环或使用向后For循环。

 for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i) 
    myTableLayoutPanelControls[i].Dispose();
  

调用Dispose将从内存中删除控件(当 GC 拾取它时)。这也将处理子控件Dispose方法的调用。

一个问题是,如果您有一个实现的自定义控件,IDisposable或者您在Dispose不调用该方法的情况下覆盖该base方法。在您的对象的Dispose方法中,您需要确保您已取消订阅您范围之外的任何事件。如果您不这样做,该引用将使您的对象保持活动状态。

于 2013-03-23T12:11:59.833 回答
0

你的问题有点混乱。Clear()将删除引用和对象将被垃圾收集器收集。

但是,你也在使用这个词dispose。清除的对象不会被释放,因为它们的Dispose方法将被调用。

因此,如果您不再使用这些对象,并且想Dispose被调用它们,则必须自己做。

于 2013-03-23T12:09:55.133 回答