设置NSMutableArray - 有人可以解释这段代码片段的作用吗?

时间:2009-07-16 12:12:25

标签: objective-c nsmutablearray

我在网上找到了这段代码。它以我以前从未见过的方式设置NSMutableArray(我是一个Obj-C newb)。有人可以解释它在做什么以及为什么你会这样做?特别是方法签名上的@syncronized,static和little加号。

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;

}

3 个答案:

答案 0 :(得分:6)

添加其他回复...发布的代码错误。应该更像这样:

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

对nil的@synchronize没有任何意义。在类方法中使用self指的是类而不是实例。此外,原始代码中的'return nil'也毫无意义。

可以完全避免使用@synchronized的更好方法是使用类初始化方法:

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

保证在使用类之前调用​​initialize方法。

答案 1 :(得分:1)

+符号表示方法为static,而不是instance方法。这意味着该方法属于类而不是类的每个实例(就像static things in Java and C#)。 @synchronized获取指定对象(like lock statement in C#)的锁定。这意味着没有其他线程可以使用该对象进入@synchronized块。

代码作为一个整体尝试在第一次初始化单例集合时(当它尚未初始化时)并将其缓存以用于后续调用该方法。同步块创建一个critical section,以便在竞争条件下使初始化部分安全,其中两个线程在仍在进行初始化时尝试获得大致相同的值。

答案 2 :(得分:1)

这是Singleton design pattern的实现,基本上是确保您只有MySprites的一个副本。

细节:

  • +表示这是一种类方法
  • @syncyronize可以访问allMySprites变量线程安全(有一些注意事项,但这是一行摘要)
  • 我认为static仅将变量的范围限制为文件