いくつかの動作を疑ってテストを実行することにしました。
私のビューコントローラには、これを行う新しいゲームメソッドがあります。
-(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インスタンスは完全には破壊されておらず、タイマーはまだどこかで実行されています。ここで何が起こっているのでしょうか。