La creación de NSMutableArray - ¿Puede alguien explicar lo que hace este fragmento de código?

StackOverflow https://stackoverflow.com/questions/1137127

  •  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;

}

¿Fue útil?

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 la allMySprites 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top