我正在使用一个TableLayoutPanel动态填充其他TablelayoutPanels.
现在我想知道当我在动态填充的TableLayoutPanel上调用TableLayoutPanel.Controls.Clear时会发生什么.显然,所有的子布局都被删除,但是他们的孩子呢?它们是否妥善处理,还是需要担心内存泄漏?
解决方法
Clear不配置控件,导致内存泄漏.从链接:
Calling the Clear method does not remove control handles from memory.
You must explicitly call the Dispose method to avoid memory leaks.
由于在循环中处理会使索引变得混乱,您可以将控件集合复制到另一个列表,并对它们执行ForEach循环或使用向后的For循环.
for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i) myTableLayoutPanelControls[i].Dispose();
Calling Dispose将从内存中删除控件(GC选择时).这也将处理调用子控件的Dispose方法.
一个抓住是如果你有一个实现IDisposable的自定义控件,或者你在不调用基本方法的情况下覆盖Dispose方法.在对象的Dispose方法中,您需要确保您已经取消订阅范围之外的任何事件.如果你不这样做,那个参考将保持你的对象活着.