【发布时间】:2012-10-24 22:03:03
【问题描述】:
注意:I've created a simple project——您可以看到故事板中
UIButton和CustomButton之间的类型切换如何改变 GC 行为。
我正试图了解 MonoTouch 垃圾收集器。
该问题与the one fixed in MT 4.0 类似,但具有继承类型。
为了说明这一点,考虑两个视图控制器,父级和子级。
子视图包含一个 UIButton,它会在点击时写入控制台。
Controller 的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 足以欺骗垃圾收集器认为子控制器尚不符合收集条件。
这是怎么回事?
【问题讨论】:
-
我在Xamarin Forums上反映了这个帖子。
标签: xamarin.ios garbage-collection xamarin