Может ли загрузка пера неправильно в 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)
{
}
}