2

我不明白 NSAssert 在中的使用+alloc,当+alloc从 调用时+sharedGameManager,静态_sharedGameManager变量是nil(所以NSAssert应该在第一次[self alloc] init]调用时停止执行......)

+(GameManager*)sharedGameManager {
    @synchronized([GameManager class])                             
    {
        if(!_sharedGameManager)                                    
            [[self alloc] init]; 
        return _sharedGameManager;                                 
    }
    return nil; 
}

+(id)alloc 
{
    @synchronized ([GameManager class])                            
    {
        NSAssert(_sharedGameManager == nil,
                 @"Attempted to allocated a second instance of the Game Manager singleton");
        _sharedGameManager = [super alloc];
        return _sharedGameManager;                                 
    }
    return nil;  
}

感谢您的回答

4

3 回答 3

3

您是否以错误的方式考虑 NSAssert?

NSAssert( _sharedGameManager==nil, @"Attempted to …");

如果 _sharedGameManager不为零,将抛出异常。它断言表​​达式为 TRUE,它说“我断言一定是这种情况”,因此_sharedGameManager必须为 nil,否则会引发异常。仅当您尝试创建此类的 2 个实例时,才会发生这种情况。

于 2012-04-19T23:09:40.980 回答
0

通过 Grand Central Dispatch 有更好的方法来保证您想要的行为:

+ (GameManager *)sharedGameManager {
    static GameManager *sharedGameManager = nil;
    static dispatch_once_t token;
    dispatch_once(&token, ^{
        sharedGameManager = [[GameManager alloc] init];
    });

    return sharedGameManager;
}

dispatch_once保证只运行一次,所以你的游戏管理器不会被过度初始化。只要您不释放它,它就会保持活动状态,并且会在程序结束时正确释放(因为它的static上下文)。

于 2012-04-19T22:21:07.767 回答
0

这看起来像是粘在一起的几个片段;alloc 是实例方法,而不是类方法(静态)。如果要执行单例类的初始化,请使用+(void)initialize

Objective-C 运行时声称保证此类方法只执行一次,因此它是设置单例的有效机制。如需进一步阅读,请点击 Mike Ash关于该主题的博客文章。

于 2012-04-19T21:48:53.800 回答