4

プロジェクトに問題があり、それを再現するサンプル プロジェクトを作成しようとしたところ、できました。

https://bitbucket.org/theonlylawislove/xamarinnavigationcontrollermemoryleak

問題は、UINavigationController を提示すると、ナビゲーション コントローラーまたはそのルート ビュー コントローラーがガベージ コレクションされないことです。ただし、iOS シミュレーターでは機能します。このメモリ リークがデバイスでのみ発生するのはなぜですか? デバイスでサンプル プロジェクトを実行すると、呼び出されたデコンストラクターに Console.WriteLine が表示されることはありません。

XCode5 と Xamarin.iOS 7.0.4.171 (Business Edition) を使用しています

これは、リークを実証するために使用している AppDelegate です。

[Register ("AppDelegate")]
public partial class AppDelegate : UIApplicationDelegate
{
    UIWindow window;
    public override bool FinishedLaunching (UIApplication app, NSDictionary options)
    {
        window = new UIWindow (UIScreen.MainScreen.Bounds);
        window.RootViewController = new UINavigationController(new RootController ());
        window.MakeKeyAndVisible ();

        return true;
    }

    class RootController : UIViewController
    {
        public RootController ()
        {
            NavigationItem.RightBarButtonItem = new UIBarButtonItem("Present", UIBarButtonItemStyle.Bordered, (o,e) => {
                PresentViewController(new NavigationController(), true, new NSAction(() => {}));
            });
        }
    }

    class NavigationController : UINavigationController
    {
        public NavigationController ()
            :base(new TestController())
        {

        }

        ~NavigationController()
        {
            Console.WriteLine("~NavigationController");
        }

        class TestController : UIViewController
        {
            ~TestController()
            {
                Console.WriteLine("~TestController");
            }

            public override void ViewDidAppear (bool animated)
            {
                base.ViewDidAppear (animated);
                Task.Factory.StartNew (() => {
                    Thread.Sleep(2000);
                    NSThread.MainThread.InvokeOnMainThread(new NSAction(() => {
                        DismissViewController(true, new NSAction(() => {

                        }));
                    }));
                });
            }
        }
    }

}
4

1 に答える 1