避免内存泄漏。 (WeakReference的)

时间:2016-09-15 09:03:42

标签: c# xamarin delegates xamarin.forms delegation

这是情景:

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

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

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

所以我的第一种方法是将按钮封装在另一个类中。 我在页面中创建了这个对象(按钮),链接到方法的事件(在页面中编码。现在我可以,在Page的类中)并将此对象传递给网格对象构造函数的新实例(另一课)。最后,我将网格(正确链接到其中的按钮)添加到Page。

嗯,我担心这不是一个好主意。我认为这可能是在“内存泄漏问题”中导出的(与删除内存中的对象相关的问题以及那些组成它们的不同类之间的引用,不是吗?),只是在两者之间创建引用不同的类(网格,按钮和页面)。

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

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

我发布了代码的想法,它是在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...
        }

谢谢你们。

1 个答案:

答案 0 :(得分:2)

对于所有移动平台(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

作为一个好习惯,我建议使用FreshMvvm使用MVVM方法,使用bind button命令建模,并使用CurrentPage参数显示操作表