2

でNSAssertを使用する方法がわかりません。からが呼び出されると、静的変数は次のようになります(したがって、最初に呼び出され+allocたときに実行を停止する必要があります...)+alloc+sharedGameManager_sharedGameManagernilNSAssert[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 …");

_sharedGameManagernilでない場合、例外をスローします。式がTRUEであることを表明し、「これが当てはまると断言します」と述べているため、_sharedGameManagernilである必要があります。そうでない場合、例外が発生します。これは、このクラスの2つのインスタンスを作成しようとした場合にのみ発生する可能性があります。

于 2012-04-19T23:09:40.980 に答える
0

これは、いくつかのスニペットが接着されているように見えます。allocはインスタンスメソッドであり、クラスメソッド(静的)ではありません。シングルトンクラスの初期化を実行する場合は、+(void)initialize

Objective-Cランタイムは、このクラスメソッドが1回だけ実行されることを保証すると主張しているため、シングルトンを設定するための効果的なメカニズムです。詳細については、このトピックに関するMikeAshのブログ投稿を参照してください。

于 2012-04-19T21:48:53.800 に答える
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は1回だけ実行されることが保証されているため、ゲームマネージャーが過剰に初期化されることはありません。あなたがそれを解放しない限り、それは生き続け、あなたのプログラムの終わりに正しく解放されます(そのstatic文脈のために)。

于 2012-04-19T22:21:07.767 に答える