0

このコードスニペットをネットで見つけました。これは、私がこれまでに見たことのない方法でNSMutableArrayをセットアップします(私はObj-Cの初心者です)。誰かがそれが何をしているのか、そしてなぜあなたがこのようにするのかを説明できますか?特に、@ syncronized、静的、およびメソッドシグネチャの小さなプラス記号。

add the following to the .h file:
+(NSMutableArray *)allMySprites;

add the following to he .m file after implementation:

static NSMutableArray * allMySprites = nil;

+(NSMutableArray *)allMySprites {
    @synchronized(allMySprites) {
        if (allMySprites == nil)
            allMySprites = [[NSMutableArray alloc] init];
        return allMySprites;
    }
 return nil;

}

4

3 に答える 3

6

他の応答に追加しています...投稿されたコードが間違っています。次のようになります。

@implementation SpriteManager
+ (NSMutableArray*) allMySprites {
    @synchronized(self) {
        if (allMySprites == nil) {
            allMySprites = [[NSMutableArray alloc] init];
        }
    }
    return allMySprites;
}
@end

nilで@synchronizeするのは意味がありません。クラスメソッドでselfを使用すると、インスタンスではなくクラスが参照されます。また、元のコードの「returnnil」は無意味です。

@synchronizedを完全に回避できるより良いアプローチは、クラス初期化メソッドを使用することです。

@implementation SomeClass
+ (void) initialize
{
    allMySprites = [[NSMutableArray alloc] init];
}
@end

初期化メソッドは、クラスが使用される前に呼び出されることが保証されています。

于 2009-07-16T12:30:19.787 に答える
1

+記号は、メソッドがメソッドとはstatic対照的であることを示しinstanceます。これは、メソッドがクラスの各インスタンスではなくクラスに属していることを意味します(staticJavaやC#の場合と同様)。@synchronized指定されたオブジェクトのロックを取得します(C#のステートメントのようlockに)。これは、他のスレッドが@synchronizedそのオブジェクトでブロックに入ることができないことを意味します。

コードは全体として、シングルトンコレクションを最初に初期化し(まだ初期化されていない場合)、そのメソッドへの後続の呼び出しで使用するためにキャッシュしようとしています。同期ブロックは、2つのスレッドが初期化を実行している間にほぼ同時に値を取得しようとする競合状態の場合に、初期化部分を安全にするためのクリティカルセクションを作成します。

于 2009-07-16T12:18:42.747 に答える
1

これはシングルトンデザインパターンの実装であり、基本的には、のコピーが1つだけであることを確認する方法ですMySprites

詳細:

  • これ+はクラスメソッドであることを意味します
  • は変数スレッドセーフ@syncyronizeにアクセスしallMySpritesます(いくつかの注意点がありますが、それは1行の要約です)
  • static変数の範囲をファイルだけに制限すると思います
于 2009-07-16T12:19:39.423 に答える