2011-01-11 11 views
21

He leído algo en algún código extranjera y quiero comprobar mi hipótesis:¿@synchronized (self) crea un bloque donde el prefijo es innecesario en las propiedades?

@synchronized(self) se utiliza para deshacerse de la self prefijo al establecer una propiedad.

Así que en mi ejemplo a continuación, estoy configurando el strText de la instancia, no solo una variable local, ¿verdad?

- (void)myfunction{ 
    NSString * strText = @"var in function"; 
    @synchronized(self) 
    { 
     strText = @"var class (self.strText)"; 
    } 

} 

Respuesta

39

Por favor, lea este Documentation

La directiva @synchronized() encierra una sección de código para su uso por un solo hilo . Otros subprocesos se bloquean hasta que el subproceso finalice el código protegido , es decir, cuando la ejecución continúa más allá de la última instrucción en el bloque @synchronized().

La directiva @synchronized() toma como único argumento cualquier objeto Objective-C, incluido self.

Como Massimo Cafaro pointed out: "Es más seguro para crear todos los objetos de exclusión mutua antes de la aplicación se convierte en multiproceso, para evitar las condiciones de carrera"

+2

El enlace de la documentación ahora está obsoleto. Consulte este: https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1 – cescofry

+0

@cescofry, sí, ese enlace estaba desactualizado. Actualizo mi respuesta con su enlace dado. Gracias. – Tirth

8

@synchronized (self) se utiliza para deshacerse de uno mismo. prefijo.

Así que, en mi ejemplo, configuré strText no en la función que configuré en la clase .

Se están fusionando dos conceptos.

  1. @synchronized(self) { ... } sólo bloquea el bloque mediante el objeto self como el semáforo.
  2. En Objective-C, no hay nada como una declaración hipotética with como en otros idiomas que elimina la necesidad de self.whatever para ser solo whatever. Puede que desee tomar el curso en línea Stanford CS193P para mejorar el idioma.
+7

¿Por qué esta respuesta? Puede "responder" a la pregunta pero, sin ofender, te encuentras tan lacónico e inútil. –

+5

@synchronized no tiene ningún efecto sobre si necesita o no un "uno mismo". prefijo. No están relacionados de ninguna manera. –

+2

Esta es la única respuesta de los tres que realmente aborda el malentendido en la pregunta @Matt. Los otros dos simplemente repiten los documentos sobre '@synchronized()' –

Cuestiones relacionadas