我在网上找到了这段代码。它以我以前从未见过的方式设置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;
}
答案 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
仅将变量的范围限制为文件