避免内存泄漏。 (弱引用)

Avoiding Memory Leak. (WeakReference)

场景是这样的:

带有条目的 XAML 有一个方法 linked 到 textchanged 的​​事件。

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

我不能 link 方法的事件到网格上的特定按钮。问题是我调用了这个方法(它有一个 DisplayActionSheet 函数,不能用简单的 class 调用。它应该来自任何类型的页面s class 或应用程序 class).

所以我的第一个方法是将按钮封装在另一个 class 中。 我在页面中创建了这个对象(按钮),linked 到方法的事件(也在页面中编码。现在我可以,在页面的 class 中)并传递这个对象到网格对象构造函数的新实例(另一个 class)。最后,我将网格(带有正确 link 的按钮)添加到页面。

嗯,恐怕这不是个好主意。我假设这可能是在“内存泄漏问题”(与删除内存中的对象相关的问题以及那些在不同 classes 之间有引用的问题,是什么组成它们,不是吗? t?),只是在不同的 classes(网格、按钮和页面)之间创建引用。

研究解决方案后,似乎可以委托此方法的事件。

但我做不到,这很容易(当你知道的时候)但是示例不是我的案例准备的(或者我找不到)。你能帮个忙吗? :)

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

            //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...
        }

谢谢大家。

所有移动平台(ios、android、xamarin)使用弱引用存储(页面、activity、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 参数

显示操作 sheet