UIPageViewController泄漏对象

时间:2014-06-28 18:53:37

标签: ios xamarin

我一直在做一些内存分析,我无法弄清楚为什么有些对象没有被垃圾收集 - 这只是使用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()
    { }
}

0 个答案:

没有答案