我正在使用动态填充其他TableLayoutPanel
的{{1}}。
现在我想知道当我在动态填充的TablelayoutPanels
上调用TableLayoutPanel.Controls.Clear
时会发生什么。显然,所有的子布局都被删除了,但他们的孩子怎么样?它们是否也妥善处理或者我是否需要担心内存泄漏?
我应该在致电TableLayoutPanel
之前递归删除孩子的孩子吗?
答案 0 :(得分:16)
Clear不会丢弃控件,导致内存泄漏。从链接:
调用Clear方法不会从内存中删除控制句柄。 您必须显式调用Dispose方法以避免内存泄漏。
由于在循环中进行处理会使索引变得混乱,因此您可以将控件集合复制到另一个列表并对其执行ForEach
循环或使用向后For
循环。
for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i)
myTableLayoutPanelControls[i].Dispose();
调用Dispose
将从内存中删除控件(当GC选择它时)。这也将处理调用子控件的Dispose
方法。
如果您有一个实现IDisposable
的自定义控件,或者您在不调用Dispose
方法的情况下覆盖了base
方法,那么就会有一个问题。在对象的Dispose
方法中,您需要确保取消订阅范围之外的任何事件。如果不这样做,该引用将使您的对象保持活力。
答案 1 :(得分:0)
你的问题有点混乱。 Clear()
将删除引用,垃圾收集器将收集对象。
但是,您也在使用dispose
这个词。清除的对象将不处理,因为它们将调用Dispose
方法。
因此,如果您不再使用这些对象,并且希望在其上调用Dispose
,则必须自己执行。