在MonoTouch中错误地加载笔尖会导致内存泄漏吗?

本文关键字:内存 泄漏 MonoTouch 错误 加载 | 更新日期: 2023-09-27 18:17:58

我正在使用MonoTouch创建我的第一个应用程序。这是一个相当简单的应用程序,从sqlite数据库中搜索代码,并在不同的视图上显示代码的不同含义。我用过界面生成器。我的问题是关于正确的方式来加载nib文件。

我的自定义表视图控制器是这样构造的:

public partial class HAZARDTableViewController : UITableViewController
{
    #region Constructors
    // The IntPtr and initWithCoder constructors are required for items that need 
    // to be able to be created from a xib rather than from managed code
    public HAZARDTableViewController (IntPtr handle) : base (handle)
    {
    }
    [Export ("initWithCoder:")]
    public HAZARDTableViewController (NSCoder coder) : base (coder)
    {
        Initialize ();
    }
    public HAZARDTableViewController ()
    {
        Console.WriteLine("HAZARDTableViewController():Constructor");
        Initialize ();
    }

在.designer.cs文件中:

public partial class HAZARDTableViewController : UITableViewController
{
#region Constructors
//The IntPtr and initWithCoder constructors are required for items that need 
// to be able to be created from a xib rather than from managed code
    public HAZARDTableViewController (IntPtr handle) : base (handle)
    {
    }
    [Export ("initWithCoder:")]
    public HAZARDTableViewController (NSCoder coder) : base (coder)
    {
        Initialize ();
    }
    public HAZARDTableViewController () //: base ("HAZARDTableViewController", null)
    {
        Console.WriteLine("HAZARDTableViewController():Constructor");
        Initialize ();
    }
    [MonoTouch.Foundation.Register("HAZARDTableViewController")]
    public partial class HAZARDTableViewController {
    private MonoTouch.UIKit.UIView __mt_view;
    private MonoTouch.UIKit.UITableView __mt_tableView;
    #pragma warning disable 0169
    [MonoTouch.Foundation.Connect("view")]
    private MonoTouch.UIKit.UIView view
    {
        get {
        this.__mt_view = ((MonoTouch.UIKit.UIView)(this.GetNativeField("view")));
        return this.__mt_view;
    }
    set {
        this.__mt_view = value;
        this.SetNativeField("view", value);
    }
    }
    [MonoTouch.Foundation.Connect("tableView")]
    private MonoTouch.UIKit.UITableView tableView {
        get {
            this.__mt_tableView = ((MonoTouch.UIKit.UITableView)(this.GetNativeField("tableView")));
        return this.__mt_tableView;
        }
    set {
            this.__mt_tableView = value;
            this.SetNativeField("tableView", value);
        }
    }
我正在看的一件事是自定义表视图控制器如何加载nib文件。我的理解是应该使用这个构造函数:
public HAZARDTableViewController () : base ("HAZARDTableViewController", null)

这会导致以下异常:

Unhandled Exception: MonoTouch.Foundation.MonoTouchException: Objective-C异常抛出。名称:NSInternalInconsistencyException原因:-[UITableViewController loadView]加载了"HAZARDTableViewController" nib,但没有得到一个UITableView.

我也尝试了这个构造函数,这是Bryan Costanich在他的伟大教程中建议的同步加载nib。

MonoTouch.Foundation.NSBundle.MainBundle.LoadNib ("HAZARDTableViewController", this, null); ViewDidLoad();

当代码引用ViewDidLoad中的TableView时,会导致null引用异常。(顺便说一句,我试过用tableView代替TableView。)

我还根据Xamarin文档尝试了这个构造函数:

public HAZARDTableViewController (string nibName, NSBundle bundle) : base(nibName, bundle) {
    Initialize();
}

结果是:

Unhandled Exception: MonoTouch.Foundation.MonoTouchException: Objective-C异常抛出。名称:NSInternalInconsistencyException原因:-[UITableViewController loadView]加载了"HAZARDTableViewController" nib,但没有得到一个UITableView.

当我只创建自己的构造函数而不尝试加载我的nib时,它可以工作。

public HAZARDTableViewController ()
{
    Console.WriteLine("HAZARDTableViewController():Constructor");
    Initialize ();
}

我不明白这是如何工作没有特别加载笔尖。让我担心的是,我的应用在使用6到7分钟后就会崩溃。我把它放进仪器里,它充满了记忆。我清理了名单,搜索了不可靠的参考资料。不管怎样,这是另一个问题。我正在仔细梳理我的代码,我想知道如果我没有正确加载我的nib文件,是否有可能它没有正确释放nib资源?对我来说,IB有点像黑盒子。

总结一下,我想知道:1. 加载笔尖的正确方式是什么?2. 为什么以上的尝试都不起作用?3.这会导致内存泄漏吗?还是我找错地方了?

在MonoTouch中错误地加载笔尖会导致内存泄漏吗?

尝试更改您的基类。我还删除了.xib设计器文件。下面是我的代码:

public partial class SearchResultsScreen : UITableViewController
{
    List<NewsArticle> NewsArticles;
    static NSString CellID = new NSString ("MyIdentifier");
    public SearchResultsScreen () : base(UITableViewStyle.Grouped)
    {
    }
}