0

いくつかの動作を疑ってテストを実行することにしました。

私のビューコントローラには、これを行う新しいゲームメソッドがあります。

-(void) newClassicGame {

    if (classicGame!=nil) {
        [classicGame saveStats];
    }

    classicGameController = nil;
    classicGameController = [[RegularGameViewController alloc] initWithPowerMode:NO ];

    classicGame = nil;
    classicGame = [[RegularGame alloc] initWithViewController:classicGameController];

    classicGameController.game = classicGame; // game property is __weak to avoid 
    //retain cycles.

    [classicGame startGame];

}

そして、オブジェクトがARCで破壊されるかどうかをテストするために、classicGameのstartGameメソッドで、次のように記述します。

-(void) startGame
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSLog(@"once");
        [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(repeat) userInfo:nil repeats:YES];
    });
//other stuff..

}

-(void) repeat {

    NSLog(@"I repeat");

}

メソッドに慣れていない人にとってはdispatch_once、アプリケーションの存続期間中にブロックが1回だけ呼び出され、それ以上呼び出されないようにするためのメソッドにすぎません。

アプリを起動し、新しいゲームをヒットすると、ゲームが開始します。「繰り返します」というログが3秒ごとに繰り返されます。その後、メニューに戻って新しいゲームをもう一度ヒットします。不思議なことに、ログは繰り返され続け、次のことを示しています。私のclassicGameインスタンスは完全には破壊されておらず、タイマーはまだどこかで実行されています。ここで何が起こっているのでしょうか。

4

1 に答える 1

4

作成したタイマーはそのターゲット ( self、ゲーム) を保持するため、少なくともタイマーが無効になるまで、ゲーム オブジェクトの割り当てが解除されることはありません。

于 2012-05-26T02:55:11.723 に答える