在initWithNibName之前调用ViewDidLoad?

ffl*_*dro 8 iphone objective-c

我有最奇怪的错误,我希望有人可以帮助我.这是我创建视图控制器并将其推送到navigationController时的代码.问题是将随机变量传递给新的视图控制器.我尝试在init方法中传递它,并使用下面注释的行传递它.

    MultipleBet *multipleBet = [[MultipleBet alloc] initWithMaxNumber:numbers andMaxStars:stars andRandom:self.random];
    NSLog(@"RANDOM1: %d", self.random);
    //[multipleBet setRandom:self.random];

    UIBarButtonItem *backButton = [[[UIBarButtonItem alloc] init] autorelease];
    backButton.title = @"Voltar";
    self.navigationItem.backBarButtonItem = backButton;
    [self.navigationController pushViewController:multipleBet animated:YES];

    [multipleBet release];
Run Code Online (Sandbox Code Playgroud)

但是,当我在MultipleBet的viewDidLoad中访问随机变量时,它始终为FALSE.

这是MultipleBet的代码:

- (id)initWithMaxNumber:(int)maxNumbers andMaxStars:(int)maxStars andRandom:(BOOL)isRandom {
    self = [super initWithNibName:@"MultipleBet" bundle:[NSBundle mainBundle]];
    ...

    self.random = isRandom;
    NSLog(@"RANDOM2: %d", self.random);
    NSLog(@"RANDOM2.1: %d", isRandom);

return self;
}
Run Code Online (Sandbox Code Playgroud)

这是viewDidLoad的代码:

- (void)viewDidLoad {
   [super viewDidLoad];


    NSLog(@"RANDOM2.2: %d", self.random);

}
Run Code Online (Sandbox Code Playgroud)

我声明变量和属性,如下所示:

BOOL random;
@property (nonatomic) BOOL random;
Run Code Online (Sandbox Code Playgroud)

输出始终为:
RANDOM2.2:0
RANDOM2:1
RANDOM2.1:1
RANDOM1:1

为什么viewDidLoad中的NSLog会在所有其他之前输出?它应该是最后一个......可能是因为我的自定义init方法?我叫[super init],所以它应该不是问题...

Alt*_*ice 21

viewDidLoadinit*方法不能保证一个接一个地执行.init*方法中的代码可能导致视图加载,因此viewDidLoad即使init*方法尚未完成也会调用.

最有可能的是,您省略的部分中的某些代码会导致视图加载.如果您将向我们展示这一部分,也许我们可以指出它.或者,您也可以将该self.random = isRandom;行作为if (self)块内的第一行移动,看看是否有效.这样,在分配之后将执行导致视图加载的任何内容self.random.

- (id)initWithMaxNumber:(int)maxNumbers andMaxStars:(int)maxStars andRandom:(BOOL)isRandom {
    self = [super initWithNibName:@"MultipleBet" bundle:[NSBundle mainBundle]];
    if (self) {
        // do this first
        self.random = isRandom;
        NSLog(@"RANDOM2: %d", self.random);
        NSLog(@"RANDOM2.1: %d", isRandom);

        // do the other code after
        ...
    }

    return self;
}
Run Code Online (Sandbox Code Playgroud)