我一直在做一些内存分析,我无法弄清楚为什么有些对象没有被垃圾收集 - 这只是使用UIPageViewController时的一个问题,我认为它可能与UIPageViewController memory leak有关但是该主题没有最终答案。
在另一个viewcontroller中我做了
var vc = new PageController;
NavigationController.pushViewController(vc, true);
vc = null;
代码为PageController对象以及Page0和Page1保存了WeakReference。
然后我点击"返回"。据我所知,不应该再引用PageController,Page0或Page1。
我强迫垃圾收集器做它的东西:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
GC.WaitForPendingFinalizers();
然后我检查我的WeakReferences,并且所有三个对象仍然存在。我只用UIPageViewController看到这个。使用UIViewController或UITableViewController,当我回击时,所有WeakReferenced对象都会消失,并执行完整的GC。
这是VS2013中的Xamarin.IOS,所以不幸的是我没有访问任何真正的内存分析器,所以我看不出是什么让这些对象保持活着。
我做错了什么?
public class PageController : UIPageViewController
{
public PageController()
: base(UIPageViewControllerTransitionStyle.Scroll, UIPageViewControllerNavigationOrientation.Horizontal)
{ }
public override void ViewDidLoad()
{
base.ViewDidLoad();
SetViewControllers(new[] {new Page0()}, UIPageViewControllerNavigationDirection.Forward, true, null);
WeakDataSource = new xSource();
}
public class xSource : UIPageViewControllerDataSource
{
public override UIViewController GetPreviousViewController(UIPageViewController pageViewController,
UIViewController referenceViewController)
{
if (referenceViewController is Page1) return new Page0();
return null;
}
public override UIViewController GetNextViewController(UIPageViewController pageViewController,
UIViewController referenceViewController)
{
if (referenceViewController is Page0) return new Page1();
return null;
}
}
}
public class Page0 : UIViewController
{
public Page0() { }
}
public class Page1 : UIViewController
{
public Page1()
{ }
}