Может ли загрузка пера неправильно в MonoTouch вызвать утечки памяти? - PullRequest
3 голосов
/ 16 декабря 2011

Я создаю свое первое приложение, используя 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);
        }
    }

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

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 Ответ

1 голос
/ 04 марта 2012

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

public partial class SearchResultsScreen : UITableViewController
{

    List<NewsArticle> NewsArticles;

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

    public SearchResultsScreen () : base(UITableViewStyle.Grouped)
    {
    }
}
...