MonoTouch でメモリ リークが発生する奇妙な問題が発生しています。これが私のセットアップです。
CaseTabController - UITabBarController
-- CaseMediaItemsController - UIViewController
-- CaseInfoController (irrelevant) - UIViewController
子コントローラーはタブとして表示されます。NavigationItem
子コントローラから、いくつかを親に追加しようとしていUITabBarController
ます。ただし、にアクセスするParentViewController
と、参照が維持され、オブジェクトが生きたままになり、ガベージ コレクションが行われることはありません。
次のコードを子 UIViewController に追加するだけでViewDidLoad
、メモリ リークが発生します。
var ni = ParentViewController.NavigationItem;
ni = null;
子タブが参照しているため、親の UITabBarController が破棄されることはありません。HeapShot からの出力は次のとおりです。
ParentViewController
子タブからアクセス可能
子タブからのアクセスParentViewController
なし
各メモリ スナップショットは、手順を除いて同じことを行った後に取得していたことに注意してください。ParentViewController への参照なしのスナップショットが破棄されているため、インスタンスの数が少ないことに注意してください。それらは非常に迅速に破棄されているため、問題のコントローラーを表示しているときに実際にスナップショットを撮りました。別のコントローラーにアクセスしているときに、ParentViewController へのアクセスなしのスナップショットが取得されていました。いずれの場合も、UITabBarController は UINavigationController からポップされています。
ParentViewController にアクセスするときに CaseMediaItemsController が CaseTabController への参照を維持する理由はありますか?