J'ai un problème de mémoire dans mon application iPhone. J'utilise MonoTouch. J'ai cherché le problème en utilisant un compteur d'instance statique. Le problème a quelque chose à voir avec les contrôleurs de vue modale. Lorsque je navigue d'un contrôleur de vue racine vers un contrôleur de premier niveau et vice-versa, je trouve que le contrôleur de premier niveau est collecté par le garbage. Mais quand je fais le modal de premier niveau-viewcontroller en appelant PresentModalViewController
, et je reviens en appelant DismissModalViewControllerAnimated
, je trouve que le contrôleur de premier niveau-vue n'est pas recueilli. Pas même quand j'appelle GC.Collect()
.UIViewController n'est pas récupéré lors du démarrage modal
Pourquoi pas? Est-ce que je fais quelque chose de mal?
Quelle est la meilleure pratique pour assurer la libération des contrôleurs de vue?
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));
}
}
Je ne peux pas répliquer ceci, mais je n'ai pas vos xibs ou code appelant. Pourriez-vous m'envoyer votre projet entier ou déposer un bug sur http://monotouch.net/Support? –