gpt4 book ai didi

ios - 不在 Xamarin 的 UIViewController 上调用 dealloc

转载 作者:行者123 更新时间:2023-11-28 21:40:29 25 4
gpt4 key购买 nike

我有一个 UIViewController 编写在绑定(bind)到我的 Xamarin 应用程序的 native 库中。 Controller 有一个方法如下:

+ (instancetype)newInstance
{
return [SharedData.sharedInstance.mainStoryboard instantiateViewControllerWithIdentifier:@"worksheetController"];
}

此方法绑定(bind)到我的 Xamarin 应用程序,如下所示:

// @interface WorksheetTableViewController : UIViewController
[BaseType(typeof(UIViewController))]
interface WorksheetTableViewController
{
// +(instancetype)newInstance;
[Static]
[Export("newInstance")]
WorksheetTableViewController NewInstance();
}

现在,在我的 Xamarin 应用程序中,在 ViewDidLoad 的 UIViewController 子类中,我按如下方式调用该方法:

this.worksheetController = WorksheetTableViewController.NewInstance();

worksheetController 未在 UIViewController 的任何其他地方使用。当此 UIViewController 被释放(通过弹出导航堆栈)时,不会调用 WorksheetTableViewControllerdealloc 方法。

但是,如果我将 ViewDidLoad 中的代码更改为如下所示:

this.worksheetController = (WorksheetTableViewController)SharedData.SharedInstance.MainStoryboard.InstantiateViewController("worksheetController");

当释放 UIViewController 时,会调用 dealloc 方法。

在我看来,原生代码中的 newInstance 方法和 Xamarin 中直接调用 InstantiateViewController 似乎没有任何区别。然而在前一种情况下 dealloc 没有被调用,而在后一种情况下一切都很好。

有人可以解释为什么这两种情况下的内存管理不同吗?

最佳答案

这是因为 ARC 将隐式保留 native newInstance 方法 [1] 的返回值,而 Xamarin.iOS 不会隐式检测到这一点。

你有两个选择:

  1. 将本地方法重命名为不以 newcopy 开头的名称(还有一些其他前缀,请参阅 [1]完整列表),这样 ARC 就不会自动保留返回值。

  2. [return: Release ()] 添加到 api 定义(这告诉 Xamarin.iOS ARC 在做什么,Xamarin.iOS 将添加一个额外的 release调用):

    [Static]
    [Export("newInstance")]
    [return: Release ()]
    WorksheetTableViewController NewInstance();

[1] http://clang.llvm.org/docs/AutomaticReferenceCounting.html#method-families

关于ios - 不在 Xamarin 的 UIViewController 上调用 dealloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32305281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com