我应该在每次使用FindViewById后调用Dispose()吗?

本文关键字:Dispose 调用 FindViewById 我应该 | 更新日期: 2023-09-27 18:08:09

为了防止Android Xamarin中的任何内存泄漏,我应该在使用FindViewById后调用Dispose()吗?

一个例子:

void SetTextSomewhereInMyView()
{
var myTextView = FindViewById<TextView>(Resouce.Id.myTextView);
myTextView.Text = "This is my Text View";
// Should I be calling dispose now? or is it OK not to call dispose?
myTextView.Dispose(); // ?
}

我没有看到在Xamarin示例中调用那么多Dispose,但后来我在一些地方读到这将是一个很好的实践。这件事的最终结论是什么?

我应该在每次使用FindViewById后调用Dispose()吗?

FindViewById是一个昂贵的调用,您不应该经常这样做。相反,将引用保存在一个字段中,并在OnDestroy或OnTrimMemory中处理该实例。

如果您只需要此视图一次,那么在使用后立即处理它。

我认为每次需要时调用FindViewById比不调用Dispose的开销更昂贵。我的方法是像这样延迟加载我的视图:

private TextView _myTextView;
public TextView MyTextView
{
    get
    {
       return _myTextView?? (_myTextView= FindViewById<TextView>(Resouce.Id.myTextView));
    }
}
void SetTextSomewhereInMyView()
{
   MyTextView.Text = "This is my Text View";
}

因此,FindViewById只在需要时调用,然后缓存对视图的引用。

简而言之:

如果你想再次使用TextView,你有Disposed,它将不得不调用FindViewById,这是一个昂贵的操作。但是,如果您正在设置TextView's Text值,不打算再次引用该TextView,那么调用Dispose

是很好的做法。