プロジェクトに問題があり、それを再現するサンプル プロジェクトを作成しようとしたところ、できました。
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(() => {
}));
}));
});
}
}
}
}