注: 我创建了一个简单的项目 -你可以看到开关之间类型
UIButton
和CustomButton
在故事板改变GC的行为。
我试图让我的头缠着MonoTouch的垃圾收集器。
这个问题类似于一个固定在MT 4.0 ,但与遗传类型。
为了说明它,考虑两个视图控制器,父母和孩子。
孩子的视图包含一个单一UIButton
写入到自来水控制台。
控制器的Dispose
,所以很难错过方法抛出异常。
这里有云子视图控制器:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
sayHiButton.TouchUpInside += (sender, e) =>
SayHi();
}
}
void SayHi()
{
Console.WriteLine("Hi");
}
protected override void Dispose (bool disposing)
{
throw new Exception("Hey! I've just been collected.");
base.Dispose (disposing);
}
父视图控制器只呈现子控制器并设置定时器驳回并运行GC:
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
var child = (ChildViewController)Storyboard.InstantiateViewController("ChildViewController");
NSTimer.CreateScheduledTimer(2, () => {
DismissViewController(false, null);
GC.Collect();
});
PresentViewController(child, false, null);
}
如果你运行这段代码,它可预见的内部崩溃ChildViewController.Dispose()
从它的终结称呼,是因为孩子控制器已经被垃圾收集。 凉。
现在打开故事板和更改按钮类型CustomButton
。 MonoDevelop中会生成一个简单UIButton
子类:
[Register ("CustomButton")]
public partial class CustomButton : UIButton
{
public CoolButton (IntPtr handle) : base (handle)
{
}
void ReleaseDesignerOutlets()
{
}
}
不知怎的,改变按钮类型CustomButton
足以欺骗垃圾收集,以为孩子控制器不符合回收。
这是怎么回事呢?