Bloqueo de una variable de instancia en Objective-C

¿Cuál debería ser la mejor manera en una aplicación de iOS para evitar que una variable de instancia sea modificada por un object mientras otra lo está usando? ¿Será suficiente el uso de @synchronized(self) directive?

Gracias por adelantado

Si desea que se bloquee un object para que no haya dos subprocesss que lo utilicen al mismo time, entonces @synchronize es de una manera. Pero esto no lo hace seguro para subprocesss .

También puede usar GCD (Grand Central Dispatch) para el mismo

¿Cuál debería ser la mejor manera en una aplicación de iOS para evitar que una variable de instancia sea modificada por un object mientras otra lo está usando?

Un buen locking antiguo, como pthread_mutex ; también podría usar un contenedor Objective-C de este (por ejemplo, NSLock y NSRecursiveLock ). @synchronized también cae en esta categoría, pero es el mecanismo de nivel más alto mencionado aquí.

Por supuesto, las soluciones concurrentes superiores suelen tener más que ver con los cambios en el layout, el flujo de progtwigs, la inmutabilidad, y así sucesivamente. Seguirán existiendo casos en los que se prefiera o se requiera la exclusión / locking mutuo.

Desgraciadamente, el ObjC / Cocoa puro carece de importancia en este campo: desarrollar un progtwig simultáneo altamente eficiente utilizando solo las tecnologías ObjC y Cocoa es mucho más difícil de lo que debería ser (o debe ser).

¿Será suficiente el uso de @synchronized (auto) directive?

Para casos simples, es adecuado. Es un Bloqueo Recursivo de nivel de object.

Sin embargo, es bastante lento, en comparación con otras opciones de exclusión mutua.

No creo que @synchronized tenga mucho que ver, aparte de:

  • conveniencia para el desarrollador para presentar (puede tener efectos secundarios negativos) y
  • simetría (garantiza que un deslocking coincida con un locking), networkinguciendo en gran medida la probabilidad de interlocking en comparación con las alternativas (un muy buen atributo).

@synchronized es conveniente , pero debido a que tiene un alto costo, debe usarse juiciosamente.

Si el único propósito es poder acceder

 self.myString; //getter 

y,

 self.myString=aString; //setter 

La mejor manera es declararlo como atómico, por ejemplo:

 @property (atomic, strong) NSString* myString; 

Esto asegurará que en un entorno de multiprocess, configurar y get myString por el subprocess 1 está protegido del subprocess 2 haciendo algo.