我遇到以下代码的问题。正如你可以创建一个TripDetailsController(UIViewController的子类),并使用initWithNibName方法初始化这个TripDetailsController。这个initWithNibName需要一个额外的参数(tripDetails),参见下面的TripDetailsController类的代码。变量td具有一个值,并且在遍历代码时,我检查了在执行initWithNibName方法时在tdController上设置了此值。但是,在TripDetailsController.viewDidLoad方法(当调用pushViewController()时执行该方法)中设置断点时,TripDetailsController的tripDetails属性为nil?!? 使用调试器我发现我在initWithNibName方法中看到的tdController实例与我在viewDidLoad方法中看到的实例是不同的实例?怎么来的?为什么创建TripDetailsController的新实例以及由谁创建?UIViewController的第二个实例实例化,失去了在原始上完成的初始化。为什么?
在这篇文章的最后,我加入了一个调用栈的转储,也许这给了你一个提示这个问题的原因。
代码:
// 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保留]因为,据推测,这个属性被自动保留。 – 2009-06-19 18:43:47