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

时间:2011-12-16 10:37:52

标签: c# memory xamarin.ios xib

我正在使用MonoTouch创建我的第一个应用程序。这是一个相当简单的应用程序,它从sqlite数据库中搜索代码,并为不同视图上的代码提供各种含义。我使用过Interface Builder。我的问题是关于加载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)

这导致了这个例外:

  

未处理的异常:MonoTouch.Foundation.MonoTouchException:抛出Objective-C异常。名称:NSInternalInconsistencyException原因: - [UITableViewController loadView]加载了“HAZARDTableViewController”笔尖,但没有得到UITableView。

我也尝试过这个构造函数,正如Bryan Costanich在他的精彩教程中建议的那样同步加载笔尖。

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

当代码引用TableView中的ViewDidLoad时,这会导致空引用异常。 (顺便说一下,我尝试使用tableView代替TableView。)

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

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

结果是:

  

未处理的异常:MonoTouch.Foundation.MonoTouchException:抛出Objective-C异常。名称:NSInternalInconsistencyException原因: - [UITableViewController loadView]加载了“HAZARDTableViewController”笔尖,但没有得到UITableView。

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

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

如果没有专门加载笔尖,我不明白这是如何工作的。为什么这令我担心的是我的应用程序在使用约6或7分钟后就会崩溃。 我把它通过仪器并且它会激发记忆力。我已经清除了列表并搜索了松散的引用。无论如何那是另一个问题。我正在使用精梳梳理我的代码,我想知道我是否正确加载我的nib文件是否可能没有正确释放nib资源? IB对我来说有点黑盒子。

总而言之,我想知道: 1.加载笔尖的正确方法是什么? 2.为什么上述尝试不起作用? 3.这会导致内存泄漏还是我找错了地方?

1 个答案:

答案 0 :(得分:1)

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

public partial class SearchResultsScreen : UITableViewController
{

    List<NewsArticle> NewsArticles;

    static NSString CellID = new NSString ("MyIdentifier");

    public SearchResultsScreen () : base(UITableViewStyle.Grouped)
    {
    }
}
相关问题