在Monotouch应用程序中调试内存泄漏

时间:2011-06-20 11:09:47

标签: memory-leaks xamarin.ios instruments

我有一个杂志Ipad应用程序,可以从滚动视图中动态添加/删除webview,以降低内存使用率。例如,我有3个视图容器,每个容器都可以移除现有的子容器......

foreach (UIView subv in targetView.Subviews) {
                foreach (UIView subsubv in subv.Subviews) {
                    subsubv.RemoveFromSuperview();
                    subsubv.Dispose();
                }   
                subv.RemoveFromSuperview();
                subv.Dispose();
            }

然后将新的Web子视图组件(或带有webview的scrollview)添加到容器中。 我添加了第二级儿童删除,但在某些情况下可能还有另一个级别。模拟器是完美的,但在IPad上,内存使用量会增加,直到它因内存不足而崩溃。 所以.....

i)monotouch是否会自动销毁所有嵌套子节点的UIView?

ii)仪器没有显示任何内存泄漏,调试此问题的最佳方法是什么?

感谢。

1 个答案:

答案 0 :(得分:3)

如果没有更多对你的UIView的引用,那么它应该得到GC。找出对象是否被收集的快速方法是创建一个继承自UIView(或您正在使用的任何类)的类,然后为该类创建终结器/析构函数。在终结器中进行控制台编写。

~MyView()
{
    Console.WriteLine("MyView: finalized");
}

运行程序时,请确保在希望收集对象时将其写入控制台。根据我的经验,模拟器几乎就像物体丢失它的最后一个参考一样立即收集物体。在设备上它可能不会那么快。