2009-08-14 21 views
17

En Objective-C, puede declarar un bloque como sincronizado en algún objeto utilizando el constructo @synchronized. Se vería algo como esto:@synchronized en un método estático

@synchronized (self) { 
    // Do something useful 
} 

Sin embargo, tengo curiosidad qué es exactamente self se refiere a cuando se tiene un método estático (+ en lugar de -). Intenté buscar en los documentos de Apple y aluden a que está bien, pero realmente no lo explico. Sé que funciona, solo tengo curiosidad por lo que significa.

Respuesta

26

self dentro de un método de clase (estático) se refiere al objeto de clase.

+0

Gracias. Sé que había algo simple que me estaba perdiendo. – Itay

+4

Tenga en cuenta que @synchronized (self) en un método de clase puede ser peligroso porque para las subclases self es un objeto diferente (clase) por lo que aún puede haber acceso concurrente al método entre esas dos clases –

13

En Objective-C self viene determinado por el contexto. En un método de instancia, esa sería la instancia a la que se llama. En un método estático, sería el objeto de clase mismo (es decir, el resultado de [self class] en un método de instancia)

0

Con las respuestas anteriores, tenga en cuenta que si un hilo llama a un método de instancia con @synchronized (self) y otro subproceso llama a un método de clase utilizando @synchronized (self), no se producirá sincronización entre las dos llamadas, porque están utilizando diferentes objetos para la sincronización.

Cuestiones relacionadas