2009-07-16 5 views
0

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

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; 

}

答えて

6

を変数のスコープを制限することを信じています応答...投稿されたコードが間違っています。

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

それがnilに@synchronizeしても意味がありません:それはもっとこのようにする必要があります。クラスメソッドでselfを使用すると、インスタンスではなくクラスが参照されます。また、元のコードの 'return nil'も無意味です。初期化メソッドは、クラスが使用される前に呼び出されることが保証されている

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

:@Synchronizedを完全に回避することができる

より良いアプローチは、クラス初期化メソッドを使用することです。

+0

+1に気付いてください。 –

+2

+あなたがサブクラスを持っている場合、+ initializeは複数回呼び出すことができます。 if(self == [SpriteManager class]){ allMySprites = [[NSMutableArray alloc] init];このようにして、クラスを実際に初期化していることを確認することをお勧めします。 } –

1

+記号はinstance方法とは対照的に、方法はstaticであることを示します。メソッドがクラスの各インスタンスではなくクラスに属していることを意味します(static things in Java and C#のように)。 @synchronizedは、指定されたオブジェクト(like lock statement in C#)のロックを取得します。これは、他のスレッドがそのオブジェクトを持つ@synchronizedブロックに入ることができないことを意味します。

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

1

Singleton design patternの実装です。基本的にはMySpritesのコピーが1つしかないことを確認する方法です。

詳細:

  • +が、これはクラスメソッド
  • @syncyronizeallMySprites変数スレッドセーフ(そこにいくつかの注意点があるが、それは、1行のサマリーです)
  • へのアクセスを行うことを意味し
  • 私はstaticが他に追加するだけで、ファイルへ