Iphone ARC-如何摆脱垃圾

Iphone ARC-如何摆脱垃圾,iphone,ios,automatic-ref-counting,Iphone,Ios,Automatic Ref Counting,我只是在怀疑某些行为后决定进行测试: 在我的视图控制器中,我有一种新的游戏方法,它可以做到这一点: -(void) newClassicGame { if (classicGame!=nil) { [classicGame saveStats]; } classicGameController = nil; classicGameController = [[RegularGameViewController alloc] initWithPo

我只是在怀疑某些行为后决定进行测试:

在我的视图控制器中,我有一种新的游戏方法,它可以做到这一点:

-(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的StartName方法中,我放了以下内容:

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


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

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

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

ha!从未想过要查找NSTimer文档。所以最后,我为测试创建的计时器失败了,具有讽刺意味。谢谢如果要检测对象何时解除分配,请使用另一个对象的
引用。当点所指向的对象被解除分配时,弱引用将设置为nil。ha!从未想过要查找NSTimer文档。所以最后,我为测试创建的计时器失败了,具有讽刺意味。谢谢如果要检测对象何时解除分配,请使用另一个对象的
引用。解除分配点所指向的对象时,弱引用将设置为nil。