2009-06-19 9 views
0

次のコードに問題があります。できるだけ早くTripDetailsController(UIViewControllerのサブクラス)を作成し、これをinitWithNibNameメソッドで初期化します。このinitWithNibNameは余分な引数(tripDetails)をとります。下記のTripDetailsControllerクラスのコードを参照してください。変数tdに値があり、コードをステップ実行するときに、initWithNibNameメソッドが実行されたときに、この値がtdControllerに設定されていることを確認しました。ただし、TripDetailsController.viewDidLoadメソッド(pushViewController()が呼び出されたときに実行される)にブレークポイントを設定する場合、TripDetailsControllerのtripDetails属性はnil? デバッガの使用私は、initWithNibNameメソッドに表示されるtdControllerインスタンスが、viewDidLoadメソッドで見られるインスタンスとは異なるインスタンスであることを発見しましたか?どうして? TripDetailsControllerの新しいインスタンスが作成されたのはなぜですか?UIViewControllerの2番目のインスタンスがインスタンス化され、元のオブジェクトに対して行われた初期化が失われます。どうして?

この記事の最後には、コールスタックのダンプが含まれていました。おそらく、この問題の原因を示すヒントがあります。

コード:

// Code from RootViewController.getTripDetails() (see stacktrace below) 
TripDetails td = ...; // td has a value 
// Push the detail view controller 
TripDetailsController *tdController = [[TripDetailsController alloc] initWithNibName:@"TripDetailsController" bundle:nil tripDetails:td]; 

      // Checked using the debugger that tdController.tripDetails is set 

[self.navigationController pushViewController:tdController animated:YES]; 
[tdController release]; 

コード:

@implementation TripDetailsController 

@synthesize tripDetails, expectedDurationLabel, normalDurationLabel; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationItem.title = @"Reis Details"; 
    expectedDurationLabel.text = [NSString stringWithFormat:@"%@", tripDetails.expectedDuration]; 
} 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle tripDetails:(TripDetails *)td { 
    self = [self initWithNibName:nibName bundle:nibBundle]; 
    self.tripDetails = td; // self.tripDetails has a value here! 
    [self.tripDetails retain]; 
    return self; 
} 

- (void)dealloc { 
    [self.tripDetails release]; 
    [super dealloc]; 
} 
@end 

alt text http://gerodt.homeip.net/stack.png

任意の提案を歓迎いたします。

下呂

+1

無関係ながら、あなたは、おそらく、そのプロパティが自動的に保持されますので、[self.tripDetailsが保持]する必要はありません。 –

答えて

0

アップルのS impleDrillDown exampleのサンプルコードに従うことで、動作させる方法が見つかりました。私の元のコードと

主な相違点:

  • TripDetailsControllerはもはや
  • TripDetailsControllerは、もはやからロード.xibファイルで定義されています。XIBファイルが、次のように初期化:

コード:

TripDetailsController *tdController = 
    [[TripDetailsController alloc] initWithStyle:UITableViewStyleGrouped]; 
  • TripDetailsControllerはもはやのUIViewControllerであるが、私は微調整しなければならなかった結果としてのUITableViewController

のサブクラスレイアウトは少しですが、少なくとも今は動作します。

XIBファイルからビューコントローラを初期化してナビゲーションコントローラにプッシュすることができないかのように見えます。

下呂

0

あなたはtripDetailsオブジェクトを保持していないので、あなたが使用しようとする前に、それが解放なっているように聞こえます。

+0

私は既にtripDetailsオブジェクトをinitWithNibNameメソッド(上記のコードを参照)に保持していましたが、tripDetailsオブジェクトが作成されたコードにretainも追加されました。これは効果がありませんでした。 TripDetailsControllerインスタンスのポインタ値が、viewDidLoadメソッドとinitWithNibNameメソッドで異なるため、問題がtripDetailsオブジェクト自体の保持であるのだろうかと思います。私はこの問題がその地域にあると思っています。 TripDetailsControllerのインスタンスが2つあるのはなぜですか?私は1つ作成します。 – Gero

+0

プロパティは(おそらく)保持しているので、retainは必要ありません。なんらかの理由でリリースされた場合、ivarが無限になるのではなく、割り当て解除されたオブジェクトにアクセスしようとすると例外が発生します。 –

0

initWithNibName:bundle:というコードを投稿する必要があります。

私は、プログラマチックに作成していますが、実際に使用されているものはNIBファイルで作成されています。たぶんあなたのメインビューNIBは、タブビューまたはナビゲーションルートとしてTripDetailsControllerを作成します。その場合、initWithNibName:bundle:の代わりにinitWithCoder:が呼び出され、初期化されていないtd ivarが説明されます。 、TripDetailsControllerインターフェイスで :標準のものを使用し、

代わりのカスタム初期化を行うと、この試してみてください:

+0

initWithNameName:bundle:tripDetailsを呼び出すコードは上記に含まれています。これは最初のコードスニペットです。残りのコードは、TripDetailsControllerの実装です。 – Gero

+0

2番目の注記:nitWithNameName:bundle:そこにブレークポイントを設定して実行を停止してからtripDetailsが呼び出されます。 – Gero

+0

それは本当に非常に奇妙です。あなたのコードを見ると、getDripDetailsのtdControllerがviewDidLoadを受け取るインスタンスとは異なるインスタンスになる可能性はありません。私が考えることができるのは、デバッガが実際に古いバージョンのコードを実行しているということだけです。ビルドターゲットの製品IDを変更したときにこれが発生しました。 –

0

待って、私は前にこれを見てきました

TripDetails td = ...; // td has a value 
TripDetailsController *tdController = [[TripDetailsController alloc] initWithNibName:@"TripDetailsController" bundle:[NSBundle mainBundle]]; 
[tdController setTripDetails:td] 

[self.navigationController pushViewController:tdController animated:YES]; 
[tdController release]; 

オリジナルの答えをthipDetailsプロパティは保持するように設定されていますか? (割り当てない)。

+0

これは私の元のアプローチで、元の投稿にリストされているアプローチと同じ効果があります。 'tdController'のポインタ値は、TripDetailsController.viewDidLoadメソッドの 'self'の値とは異なります(tripDetails属性はviewDidLoadではnilです)。 はい、tripDetailsプロパティは.hファイルに保持されるように設定されています。 – Gero

+0

このクラスでは問題ありませんが、if(self = [super initWithNib:bundle:])?奇妙なのは、同じものではないということです。私は別のプロジェクトでこのコードを書き直し、何が起こるかを見てみよう。あなたがバグを追跡するのが難しいように思えます。 –

関連する問題