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方法的人来说,它只是一种确保在应用程序的生命周期内只调用一次块的方法。

我启动我的应用程序,点击新游戏并开始游戏 - 我看到日志“我重复”每 3 秒重复一次”。然后我回到菜单并再次点击新游戏。奇怪的是,日志一直在重复,表明我的 classicGame 实例没有完全销毁,计时器仍在某处运行。知道这里发生了什么吗?

4

1 回答 1

4

您创建的计时器保留其目标(self游戏),因此您的游戏对象至少在计时器失效之前不会被释放。

于 2012-05-26T02:55:11.723 回答