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 是指类而不是实例。原始代码中的“返回零”也是毫无意义的。

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

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

保证在使用类之前调用​​初始化方法。

于 2009-07-16T12:30:19.787 回答
1

+符号表示方法与方法static相对instance。这意味着该方法属于类而不是类的每个实例(就像staticJava 和 C# 中的东西一样)。@synchronized获取指定对象的锁(lockC# 中的语句)。这意味着没有其他线程可以进入@synchronized带有该对象的块。

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

于 2009-07-16T12:18:42.747 回答
1

它是Singleton 设计模式的一种实现,基本上是一种确保您只有一个MySprites.

细节:

  • +意味着这是一个类方法
  • 使@syncyronize访问allMySprites变量线程安全(有一些警告,但这是一行摘要)
  • 我相信static变量的范围仅限于文件
于 2009-07-16T12:19:39.423 回答