viewDidLoad在构造函数之前调用

时间:2011-03-15 11:53:14

标签: ios4 constructor memory-management viewdidload

此问题与this one有关。我有两个构造函数:

- (id)initWithBanner:(NSMutableArray *)banners {
  if ( self = [super initWithNibName:@"UIBanner" bundle:nil] ) {
     testString = [[NSString alloc] initWithString:@"Banner"];
     NSLog(@"Foo");
  }

  return self;
}

- (id)initWithPreview:(NSMutableArray *)previews {
  if ( self = [super initWithNibName:@"UIBanner" bundle:nil];
    testString = [[NSString alloc] initWithString:@"Preview"];
    NSLog(@"Foo");
  }

  return self;
}

- (void)viewDidLoad {
  NSLog(@"%@", testString);
}

在另一个对象中,我有两个这个类的实例叫做* bannerPreview和* bannerVideo,用initWithPreview和initWithVideo初始化。它发生了什么: 在预览构造函数中,我无法访问IBOutlets,因为它们是零,而它们不在横幅中。但是bannerVideo的viewDidLoad方法在构造函数完成之前被调用,而bannerPreview的viewDidLoad却没有。我在类中添加了一个字符串测试,并在上面列出的两种方法中添加了一个NSLog(@“Foo”),我的输出是:

2011-03-15 12:29:13.929 iUDC[2600:207] Foo
2011-03-15 12:29:13.934 iUDC[2600:207] preview
2011-03-15 12:29:15.038 iUDC[2600:207] (null)
2011-03-15 12:29:15.038 iUDC[2600:207] Foo

我该如何处理这种行为?

2 个答案:

答案 0 :(得分:0)

您在init中所做的事情应与您在viewDidLoad中的行为无关。任何依赖于self.view的内容都应该在viewDidLoad中完成。

viewDidLoad完成之前或之后调用init取决于加载视图所需的时间以及执行init所需的时间。

答案 1 :(得分:0)

您的initWithPreview:方法中存在错误。应该说:

[super initWithNibName:@"UIPreview" bundle:nil]