首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >避免内存泄漏。(WeakReference)

避免内存泄漏。(WeakReference)
EN

Stack Overflow用户
提问于 2016-09-15 09:03:41
回答 1查看 2.3K关注 0票数 1

这是一种情况:

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

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

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

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

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

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

但我无法做到这一点,这很容易(当你知道的时候),但这些例子并不是由我的案例准备的(或者我找不到)。你能帮个忙吗?

我发布了代码的想法,它是在ListView内部的Button上实现的,在网格中(稍微复杂一点,但我想简化它)。

代码语言:javascript
复制
            //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...
        }

谢谢你们。

EN

Stack Overflow用户

回答已采纳

发布于 2016-09-15 09:12:47

对于所有移动平台(ios、android、xamarin)来说,使用弱引用来存储(页面、活动、UIViewcontroller)是很好的做法。可以实现对页面的引用,如下所示:

代码语言:javascript
复制
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参数显示操作表。

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39507042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档