避免内存泄漏.(WeakReference引用)

本文关键字:WeakReference 引用 泄漏 内存 | 更新日期: 2023-09-27 18:07:02

场景如下:

带有Entry的XAML有一个方法链接到textchanged的事件。

在将UI组件(在本例中为网格)封装到类中以提高代码的可维护性之后,我发现了下一个问题:

我不能将方法的事件链接到网格上的特定按钮。问题是我调用这个方法(它有一个DisplayActionSheet函数,不能在一个简单的类中调用。)它应该来自任何类型的Page类或Application类)。

所以我的第一种方法是将按钮封装在另一个类中。我在Page中创建了这个对象(按钮),链接到方法的事件(也在页面中编码)。现在我可以(在Page的类中)将这个对象传递给网格对象构造函数的一个新实例(另一个类)。最后,我添加了网格(与按钮正确链接到它)到页面。 嗯,恐怕这不是一个好主意。我假设这可能是在"内存泄漏问题"(有关删除内存中的对象和那些在不同类之间有引用的问题组成它们,不是吗?),只是在不同类(网格,按钮和页面)之间创建引用。

经过研究,解决方案看起来像委托这个方法的事件。

但是我不能实现它,这很容易(当你知道的时候),但是例子不是根据我的情况准备的(或者我找不到它)。你能帮个忙吗?:)

我发布了代码的想法,它是在ListView内部的按钮上实现的,在网格内部(有点复杂,但我想简化它)。

            //This code is called in CarouselPage
            // ..............
            //ButtonEstadoTarea is type Button
            ButtonEstadoTarea bet = new ButtonEstadoTarea();
            //OnStartClicked is allocated is this CarouselPage
            //
            bet.Clicked += this.OnStartClicked;
            ListViewIntervencion lvi = new ListViewIntervencion();
            lvi.ItemTapped += this.OnItemTapped;
            lvi.ItemsSource = intervencion.Interv;
            GridCabeceraIntervencion gci = new GridCabeceraIntervencion(intervencion, lvi);
            var intervencionContent = new ContentPage
            {
                Content = gci,
            };
            this.Children.Add(intervencionContent);
        async void OnStartClicked(object sender, EventArgs args)
        {
            var action = await DisplayActionSheet("Procesar Tarea", null, "Cancel", "Iniciar", "Pausar", "Bloquear", "Terminar");
            // MORE MAGIC...
        }

谢谢。

避免内存泄漏.(WeakReference引用)

对于所有移动平台(ios, android, xamarin)使用弱引用来存储(页面,活动,UIViewcontroller)是很好的实践。您可以像这样实现对页面的引用:

WeakReference<Page> _pageReference;
public Page Page{
   get {
      Page _page = null;
      _pageReference.TryGetTarget(out _page);
      return _page;
   }
   set{
      _pageReference = new WeakReference<Page>(value);
   }
}

访问页面属性时,不要忘记检查是否为null。这样就不会有内存泄漏。要了解更多关于弱引用的信息,请阅读:https://msdn.microsoft.com/en-us/library/gg712738 (v = vs.110) . aspx

作为一个很好的做法,我建议使用MVVM方法使用FreshMvvm,绑定按钮命令模型,并使用CurrentPage参数

显示动作表