我在iPhone應用程序中遇到內存問題。我正在使用MonoTouch。我通過使用靜態實例計數器來追究這個問題。這個問題與模態視圖控制器有關。當我從根視圖控制器導航到第一級視圖控制器並返回時,我發現第一級視圖控制器是垃圾收集的。但是當我通過調用PresentModalViewController
來製作第一級viewcontroller模式時,我通過調用DismissModalViewControllerAnimated
返回,我發現第一級viewcontroller不是垃圾收集。即使我打電話給GC.Collect()
。UIViewController在啓動模式時不會收集垃圾
爲什麼不呢?難道我做錯了什麼?
確保視圖控制器發佈的最佳做法是什麼?
partial class RootViewController : UITableViewController
{
static int instanceCount;
static int nextId;
int instanceId;
public RootViewController (IntPtr handle) : base(handle)
{
instanceCount++;
instanceId = nextId++;
Console.WriteLine(string.Format("RootViewController #{0} Count={1}", instanceId, instanceCount));
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
Title = "Root";
NavigationItem.RightBarButtonItem = new UIBarButtonItem("ModalVC", UIBarButtonItemStyle.Plain,
delegate
{
var firstlevelVc = new FirstLevelViewController();
PresentModalViewController(new UINavigationController(firstlevelVc), true);
});
NavigationItem.LeftBarButtonItem = new UIBarButtonItem("PushVC", UIBarButtonItemStyle.Plain,
delegate
{
var firstlevelVc = new FirstLevelViewController();
NavigationController.PushViewController(firstlevelVc, true);
});
}
public override void ViewDidAppear (bool animated)
{
base.ViewDidAppear (animated);
GC.Collect();
}
~RootViewController()
{
instanceCount--;
Console.WriteLine(string.Format("RootViewController #{0} Count={1}", instanceId, instanceCount));
}
}
public partial class FirstLevelViewController : UIViewController
{
static int instanceCount;
static int nextId;
int instanceId;
public FirstLevelViewController (IntPtr handle) : base(handle)
{
Initialize();
}
[Export("initWithCoder:")]
public FirstLevelViewController (NSCoder coder) : base(coder)
{
Initialize();
}
public FirstLevelViewController() : base("FirstLevelViewController", null)
{
Initialize();
}
void Initialize()
{
instanceCount++;
instanceId = nextId++;
Console.WriteLine(string.Format("FirstLevelViewController #{0} Count={1}", instanceId, instanceCount));
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
Title = "1. level";
NavigationItem.RightBarButtonItem = new UIBarButtonItem("Dismiss modal",
UIBarButtonItemStyle.Plain,
delegate { ParentViewController.DismissModalViewControllerAnimated(true); });
}
~FirstLevelViewController()
{
instanceCount--;
Console.WriteLine(string.Format("FirstLevelViewController #{0} Count={1}", instanceId, instanceCount));
}
}
我不能複製這個,但我沒有你的xibs或調用代碼。您可以向我發送整個項目,或者在http://monotouch.net/Support上提交錯誤消息嗎? – 2010-11-04 15:09:08