迁移到Unified API和新引用计数

时间:2015-02-01 13:20:55

标签: xamarin.ios xamarin reference-counting

我有一个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项目,问题也无法再现。

什么可能导致这种行为?

1 个答案:

答案 0 :(得分:3)

这是设计上的,没有理由让本机UIView实例的托管对等体保持活动状态(在您的特定测试用例中),因此它是垃圾回收。

如果我们发现稍后需要托管对等体,则会创建一个新实例。

这个答案提供了对正在发生的事情的更深入的解释:Is this a bug in MonoTouch GC?(但是你需要在行之间读一点,因为这回答了相反的问题)。