La creación de NSMutableArray - ¿Puede alguien explicar lo que hace este fragmento de código?
-
16-09-2019 - |
Pregunta
He encontrado este fragmento de código en la red. Se establece una NSMutableArray en una forma que no había visto antes (soy un Novato Obj-C). ¿Puede alguien explicar lo que está haciendo y por qué lo haría de esta manera? En particular, el signo más @syncronized, estático y poco en la firma del método.
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;
}
Solución
Adición a las otras respuestas ... publicado el código es incorrecto. Debería ser de la misma familia:
@implementation SpriteManager
+ (NSMutableArray*) allMySprites {
@synchronized(self) {
if (allMySprites == nil) {
allMySprites = [[NSMutableArray alloc] init];
}
}
return allMySprites;
}
@end
No tiene sentido a @synchronize en nulo. Uso de auto en un método de clase se refiere a la clase y no la instancia. También el 'retorno a cero' en el código original no tiene sentido.
Un mejor enfoque donde el @synchronized puede evitarse por completo es utilizar un método inicializador de la clase:
@implementation SomeClass
+ (void) initialize
{
allMySprites = [[NSMutableArray alloc] init];
}
@end
Los métodos initialize están garantizados para ser llamado antes de que se utiliza la clase.
Otros consejos
El signo +
indica el método se static
en contraposición a instance
métodos. Esto significa que el método pertenece a la clase en lugar de cada instancia de una clase (al igual cosas static
en Java y C # ). @synchronized
adquiere un bloqueo en el objeto especificado ( como declaración en lock
C # ). Se significa que no hay otro hilo puede entrar en un bloque @synchronized
con ese objeto.
El código en su conjunto está tratando de inicializar una colección singleton primera vez (cuando no está inicializado) y almacenar en caché para su uso en posteriores llamadas a ese método. El bloque sincronizado crea una crítica para hacer la parte de inicialización segura en caso de una condición de carrera en donde dos subprocesos intentan obtener el valor más o menos al mismo tiempo, mientras que todavía está haciendo la inicialización.
Es una implementación de la Singleton patrón de diseño , básicamente una forma de asegurarse de que usted sólo tienen una copia de su MySprites
.
Los detalles:
- El
+
significa que este es un método de clase - El
@syncyronize
hace que el acceso a laallMySprites
flujos seguros variable (hay algunas advertencias, pero ese es el resumen de una línea) - Creo que la
static
limita el alcance de la variable sólo para el archivo