2009-07-16 42 views
0

我在網上找到了這段代碼。它以我以前從未見過的方式設置NSMutableArray(我是Obj-C newb)。有人可以解釋它在做什麼,爲什麼你會這樣做?特別是方法簽名上的@syncronized,static和little加號。設置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 

@nynchronize on nil沒有意義。在類方法中使用self是指類而不是實例。原始代碼中的'return nil'也是毫無意義的。

一種更好的方法,其中@synchronized可以完全避免是使用一個類初始化方法:

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

初始化方法是保證在使用前級被調用。

+0

+1注意到它 – 2009-07-16 12:51:18

1

+符號表示方法是static而非instance方法。這意味着該方法屬於類而不是類的每個實例(就像static things in Java and C#)。 @synchronized獲取指定對象的鎖(like lock statement in C#)。這意味着沒有其他線程可以使用該對象輸入@synchronized塊。

該代碼作爲一個整體試圖初始化一個單一的集合第一次(當它尚未初始化),並緩存它用於後續調用該方法。同步塊創建一個critical section,以便在兩個線程嘗試在初始化期間大致同時獲取值的競爭情況下使初始化部分安全。

1

這是Singleton design pattern的實現,基本上是確保您只有MySprites的一個副本的方法。

細節:

  • +意味着這是一個類方法
  • @syncyronize使得訪問allMySprites可變線程安全的(有幾個注意事項但是這是一個一行摘要)
  • 我相信static限制變量的範圍只到文件
相關問題