我正在使用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分钟后,我的应用程序崩溃了。
我把它放在乐器上,它散发出了记忆。我已清除列表并搜索了松散的引用。无论如何,这是另一个问题。我正在用精巧的梳理代码,不知道我是否未正确加载我的笔尖文件,是否可能没有正确释放笔尖资源? IB对我来说有点黑匣子。
因此,总结一下,我想知道:
1.装入笔尖的正确方法是什么?
2.为什么上述尝试不起作用?
3.这可能导致内存泄漏,还是我找错了地方?
最佳答案
尝试更改您的基类。我还删除了.xib设计器文件。这是我的代码:
public partial class SearchResultsScreen : UITableViewController
{
List<NewsArticle> NewsArticles;
static NSString CellID = new NSString ("MyIdentifier");
public SearchResultsScreen () : base(UITableViewStyle.Grouped)
{
}
}
关于c# - 在MonoTouch中错误地装入 Nib 会导致内存泄漏吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8532944/