我有一个Xamarin.iOS Classic项目并将其迁移到Unified API。
我的代码中有一个视图控制器(简化版):
public class TestViewController : UIViewController
{
private WeakReference<UIView> _viewRef;
public override void ViewDidLoad()
{
base.ViewDidLoad();
_viewRef = new WeakReference<UIView>(View);
StartTimer();
}
private async void StartTimer()
{
await Task.Delay(1000);
// _viewRef is not alive here
}
}
[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
UIWindow _window;
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
_window = new UIWindow(UIScreen.MainScreen.Bounds);
var testController = new TestViewController();
_window.RootViewController = testController;
_window.MakeKeyAndVisible();
return true;
}
}
这里的奇怪行为是 _viewRef 弱引用变得不活跃。因此,视图控制器的托管视图实例似乎是垃圾回收。尽管如此,我可以使用UIViewController.View属性访问UIView而没有任何问题。
Classic API项目没有这个问题。我想这里的区别是由于使用Xamarin的new Refcount统一API。
真正奇怪的是,那时我从空白处启动一个Unified API项目,问题也无法再现。
什么可能导致这种行为?
答案 0 :(得分:3)
这是设计上的,没有理由让本机UIView实例的托管对等体保持活动状态(在您的特定测试用例中),因此它是垃圾回收。
如果我们发现稍后需要托管对等体,则会创建一个新实例。
这个答案提供了对正在发生的事情的更深入的解释:Is this a bug in MonoTouch GC?(但是你需要在行之间读一点,因为这回答了相反的问题)。