我在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