2011-12-16 3 views
3

MonoTouch를 사용하여 첫 번째 앱을 만들었습니다. 그것은 매우 간단한 응용 프로그램입니다 sqlite 데이터베이스에서 코드를 검색하고 다양한 견해에있는 코드에 대한 다양한 의미를 제공합니다. 인터페이스 빌더를 사용했습니다. 내 질문은 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 : 던져 목표 - C 예외. 이름 : NSInternalInconsistencyException 이유 : - [UITableViewController loadView]가 "HAZARDTableViewController"펜촉을로드했지만 UITableView를 가져 오지 않았습니다.

브라이언 코 스태 니치 (Bryan Costanich)가 제안한 훌륭한 튜토리얼에서 제안한 것처럼이 생성자를 동 기적으로로드하려고 시도했습니다. 코드 ViewDidLoad에서 TableView 지칭 때

MonoTouch.Foundation.NSBundle.MainBundle.LoadNib ("HAZARDTableViewController", this, null); ViewDidLoad(); 

이 null 참조 예외로 이끈다. (BTW 나는 tableView 대신 TableView의를 사용하여 시도했다.)

나는 또한 자 마린의 documenation에 따라이 생성자 시도했다 :

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 분 사용 후 내 앱이 넘어지는 것을 우려합니다. 나는 악기를 통해 그것을 넣었습니다 그리고 그것은 메모리를 gushes. 목록을 지우고 느슨한 참조를 찾았습니다. 어쨌든 다른 질문이 있습니다. 괜찮은 빗으로 코드를 살펴보고, 펜촉 파일을 올바르게로드하지 않으면 펜촉 리소스를 제대로 공개하지 않을 가능성이 있습니까? 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) 
    { 
    } 
} 
관련 문제