我决定在怀疑某些行为时进行测试:
在我的视图控制器中,我有一个新的游戏方法可以做到这一点:
-(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
方法的人来说,它只是一种方法,可以确保在应用程序的生命周期内只调用一次,而不是更多。
我开始我的应用程序,点击新游戏和游戏开始 - 我看到日志“我重复”每3秒重复一次“..然后我回到菜单再次点击新游戏。奇怪的是,日志不断重复,表明我的classicGame实例没有完全被破坏,计时器仍在某处运行。有什么想法在这里发生了什么?
答案 0 :(得分:4)
您创建的计时器会保留其目标(self
,即游戏),因此至少在计时器失效之前,您的游戏对象不会被解除分配。