2011-12-16 13 views
3

MonoTouchを使用して私の最初のアプリを作成しています。それは、sqliteデータベースからコードを検索し、異なるビュー上のコードのさまざまな意味を持ち出す、かなりシンプルなアプリケーションです。私はInterface Builderを使用しました。私の質問は、nibファイルをロードする正しい方法に関するものです。MonoTouchでペン先を間違ってロードするとメモリリークが発生する可能性がありますか?

マイカスタムテーブルビューコントローラはこのように構成されています.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() 
    { 
     Console.WriteLine("HAZARDTableViewController():Constructor"); 
     Initialize(); 
    } 

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

コードがViewDidLoadTableViewを指す場合、これはnull参照例外をもたらします。

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

未処理の例外:MonoTouchで私はまた、Xamarinのdocumenationに従って、このコンストラクタを試してみた(ちなみに私が代わりにTableViewtableViewを使用して試してみました。)

。 Foundation.MonoTouchException:Objective-C例外がスローされました。名前:NSInternalInconsistencyException理由: - [UITableViewController loadView]が "HAZARDTableViewController"ペン先をロードしましたが、UITableViewを取得しませんでした。

私はちょうど私のペン先をロードしようとせずに自分のコンストラクタを作るときに動作します。

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

具体的にはペン先をロードせずにこの動作を理解できません。なぜこれは私のアプリが約6または7分の使用の後に落ちるということです。 私は楽器を介してそれを入れて、それはメモリを溶かす。私はリストをクリアし、緩い参照を探しました。とにかく別の質問があります。私は細かい櫛でコードを実行していますが、正しくnibリソースを解放していない可能性がありますか? IBは私にとってはブラックボックスのビットです。

要約すると、私は知りたいと思います: 1.ペン先を正しくロードする方法は何ですか? 2.上記の試みはなぜ機能しないのですか? 3.これはメモリリークを引き起こす可能性がありますか、間違った場所を探していますか?

答えて

2

基本クラスを変更してみてください。 .xibデザイナーファイルも削除しました。ここに私のコードです:

public partial class SearchResultsScreen : UITableViewController 
{ 

    List<NewsArticle> NewsArticles; 

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

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