次のコードに問題があります。できるだけ早く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
任意の提案を歓迎いたします。
下呂
無関係ながら、あなたは、おそらく、そのプロパティが自動的に保持されますので、[self.tripDetailsが保持]する必要はありません。 –