Может ли загрузка пера неправильно в MonoTouch вызвать утечки памяти?

Я создаю свое первое приложение, используя MonoTouch. Это довольно простое приложение, которое ищет код из базы данных sqlite и отображает различные значения кода в разных представлениях. Я использовал Interface Builder. Мой вопрос касается правильного способа загрузки файла пера.

Мои контроллеры пользовательских таблиц построены так:

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);
        }
    }

Одна из вещей, на которые я смотрю, - как пользовательские контроллеры табличного представления загружают файлы пера. Насколько я понимаю, этот конструктор следует использовать:

public HAZARDTableViewController () : base ("HAZARDTableViewController", null)

Это приводит к этому исключению:

Необработанное исключение: MonoTouch.Foundation.MonoTouchException: генерируется исключение Objective C. Имя: NSInternalInconsistencyException Причина: -[UITableViewController loadView] загрузил перо "HAZARDTableViewController", но не получил UITableView.

Я также попробовал этот конструктор, как предложил Брайан Костанич в его великолепных уроках, чтобы синхронно загрузить перо.

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 минут использования. Я пропустил это через инструменты, и это наполняет память. Я очистил списки и искал свободные ссылки. Во всяком случае, это для другого вопроса. Я просматриваю свой код с помощью прекрасной расчески, и мне интересно, правильно ли я загружаю свой файл пера, возможно ли, что он неправильно высвобождает ресурсы пера? Для меня IB - это черный ящик.

Подводя итог, я хотел бы знать: 1. Как правильно загружать перо? 2. Почему вышеупомянутые попытки не работают? 3. Может ли это быть причиной утечки памяти или я смотрю не в том месте?

1 ответ

Попробуйте изменить свой базовый класс. Я также удалил.xib конструктор файл. Вот мой код:

public partial class SearchResultsScreen : UITableViewController
{

    List<NewsArticle> NewsArticles;

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

    public SearchResultsScreen () : base(UITableViewStyle.Grouped)
    {
    }
}
Другие вопросы по тегам