C# Windows Phone-使用OnNavigatedFrom';s NavigationEventArgs。会有内存泄漏吗?
因此,我的场景是,page1.xaml有一个可单击的项目列表。比如,第1项、第2项、第3项。单击其中任何一项后,将向用户显示page2.xaml(例如,用户需要登录才能看到第#1、#2或#3项的内容) 因此,page2.xaml有一个“login”按钮。单击用户应登录的应用程序,并显示“下一页”。“下一页”可以是第1项、第2项或第3项的内容 例如,我不想将下一页存储为相对url的字符串,因为“下一页”可能需要参数。例如,要显示项目#2,我需要传递项目id和一组其他参数 因此,我需要设置page2.xaml,使它知道“下一页”以及导航到下一页时要传递的参数 这是我找到的密码。。。 我们有第1页 然后,我们有第2页:C# Windows Phone-使用OnNavigatedFrom';s NavigationEventArgs。会有内存泄漏吗?,c#,silverlight,windows-phone-7,C#,Silverlight,Windows Phone 7,因此,我的场景是,page1.xaml有一个可单击的项目列表。比如,第1项、第2项、第3项。单击其中任何一项后,将向用户显示page2.xaml(例如,用户需要登录才能看到第#1、#2或#3项的内容) 因此,page2.xaml有一个“login”按钮。单击用户应登录的应用程序,并显示“下一页”。“下一页”可以是第1项、第2项或第3项的内容 例如,我不想将下一页存储为相对url的字符串,因为“下一页”可能需要参数。例如,要显示项目#2,我需要传递项目id和一组其他参数 因此,我需要设置page2
公共部分类第2页:PhoneApplicationPage
{
公共对象[]参数;
公共行动goToNextPage;
公共页1()
{
初始化组件();
}
//...//
私有无效按钮\u单击(对象发送者,事件参数e)
{
GoToNextPage(参数);
}
}
现在,我的问题是。。。这会导致内存泄漏吗
我不太确定这个
Page2将有一个参数字段,该字段是对Page1的引用
参数FornextPage
这是否意味着当Page1转到Page2时,Page2将阻止Page1被垃圾收集,因为它包含对Page1字段的引用
但即使是这样,当从第2页导航到“下一页”时。。。垃圾收集器现在会删除第1页和第2页吗
我可能不太清楚,因为我不习惯在网上发布编码问题,但希望有人能帮我澄清关于这种情况下垃圾收集工作原理的疑问
顺便说一句,这可能不是传递数据的最佳方式,如果是这样的话,请随意向我建议另一种方式来实现这一逻辑
Cheers使用
参数FornextPage
,您不保留对Page1的引用,而是保留对Page1引用的对象的引用。因此,垃圾收集器没有问题
我更担心的是HandleActionFunc
。您不会显示它,但如果它是在第1页上声明的实例方法,则它将阻止垃圾收集器清理第1页
也就是说,您必须记住,只要Page1在后堆栈中存在,它就会一直保存在内存中。因此,如果您不打算在第2页上导航时清除后堆栈,则无需担心,因为无论哪种方式,第1页都将保持活动状态
public partial class Page1 : PhoneApplicationPage
{
public Page1()
{
InitializeComponent();
}
private object[] parametersForNextPage;
protected override OnNavigatedFrom(NavigationEventArgs e)
{
if (e.Content is Page2 )
{
if (parametersForNextAction != null)
{
var mm = (Page2)e.Content;
// The reason why I need to set mm.NextPage and mm.parameters is because the NextPage could be any page
mm.NextPage = HandleActionFunc; // This is some another function that will be called after Page2
mm.parameters = parametersForNextPage; // HandleActionFunc needs parameters
}
}
}
private void Item_Click(object sender, RoutedEventArgs e)
{
var control = (SomeRandomUserControlDefinedByMe)sender;
parametersForNextPage = control.parameters;
PageNavController.NavigateToPage2();
}
}
public partial class Page2 : PhoneApplicationPage
{
public object[] parameters;
public Action<object[]> goToNextPage;
public Page1()
{
InitializeComponent();
}
//...//
private void Button_Click(object sender, EventArgs e)
{
GoToNextPage(parameters);
}
}