更好的选择:Singleton还是dispatch_once?

时间:2014-04-01 14:03:56

标签: ios memory-management singleton sprite-kit

我在大约10个纹理地图集中包含了大量动画。我正在研究的项目有很多坏人跑来跑去,所以每次实例化坏人类时我都不应该复制所有的动画。

我应该使用(选项A)单例类来存储我的所有坏人动画,并让它在坏人类需要时返回特定动画或插入(选项B):

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// do animating stuff here...
});
进入我的坏人课程?或者这是番茄与番茄的情况吗?

P.S。我真的很喜欢使用我自己的类方法,所以如果选项B是答案,那么非常感谢哦!

2 个答案:

答案 0 :(得分:1)

要回答使用singleton vs dispatch_once的问题,dispatch_once本身不是单例,而是经常用作在单例访问器方法中实例化单例的方法。它将确保该块仅为程序的生命执行一次。我们可以使用它来确保我们只创建一次对象。

实施例

+(instancetype)sharedInstance {
    static MySingletonClass *s_sharedPointer = nil;
    static dispatch_once_t onceToken;
    dispatch_once(onceToken, ^{ // ensures we only ever create one MySingletonClass
        s_sharedPointer = [[MySingletonClass alloc] init];
    });
    return s_sharedPointer;
}

我对Spritekit或动画的细微差别并不熟悉,所以我无法提供有关您具体问题的详细信息,但我希望我的回答能提供一些方向。希望能够了解更多关于使用动画的其他人会更好地了解好的课堂设计。

答案 1 :(得分:1)

也许看看Apple的code:Explained Adventure。在#34;加载共享字符资产"部分,他们使用:

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

    sSharedIdleAnimationFrames = APALoadFramesFromAtlas(@"Boss_Idle", @"boss_idle", kBossIdleFrames);
    // (Load other animation frames)
    sSharedDamageEmitter = [SKEmitterNode apa_emitterNodeWithEmitterNamed:@"BossDamage"];
    sSharedDamageAction = [SKAction sequence:@[
        [SKAction colorizeWithColor:[SKColor whiteColor] colorBlendFactor:1.0 duration:0.0],
        [SKAction waitForDuration:0.5],
        [SKAction colorizeWithColorBlendFactor:0.0 duration:0.1]]];
}