En primer lugar, los no atómicos usan bloqueos para asegurarse de que ningún otro subproceso pueda obtener / establecer un valor cuando otro subproceso esté realizando alguna tarea en él.
El bloqueo se logra usando la palabra clave * @ sincronizada *. ¿Qué hace exactamente @synchronized?
Ahora responda a su pregunta:
- ¿Por qué los sistemas operativos iOS recientes, como 10.3.3, hacen que los modelos de iPhone anteriores, como el 5c, tengan ralentizaciones de rendimiento en tareas comunes, como el inicio y el cambio entre aplicaciones? ¿Qué cambios en la arquitectura del sistema operativo explican esto?
- ¿Por qué no hay una aplicación de iOS para Amazon Cloud Player? (edición publicada en junio de 2012)
- ¿Cuál es una alternativa para las pruebas de Calabash / Cucumber para aplicaciones iOS?
- ¿Qué API existen para la eliminación de fondo de la foto en aplicaciones iOS y Android?
- ¿Dónde se puede encontrar un adaptador Lightning de base de 30 pines a 8 pines compatible con una base de radio?
Si ve la implementación real del atributo * atómico * y * no atómico *, puede ver fácilmente lo que realmente está sucediendo.
Cuando yo escribo:
// @ propiedad (no atómica, retener) NSString * myName;
Genera el siguiente código:
– (NSString *) myName {
devuelve myName;
}
– (nulo) setMyName: (NSString *) myName_ {
[miNombre_ retener];
[lanzamiento de myName];
myName = myName_;
}
Tenga en cuenta que no hay una palabra clave * atómica *, si no especifica * no atómica *, la propiedad es atómica, pero si especifica * atómica * explícitamente se producirá un error.
Ahora la variante atómica es más complicada:
// @ propiedad (retener) NSString * myName;
– (NSString *) myName {
UITextField * retval = nil;
@synchronized (self) {
retval = [[mi nombre retener] liberación automática];
}
retorno retval;
}
– (nulo) setMyName: (NSString *) myName_ {
@synchronized (self) {
[lanzamiento de myName];
miNombre = [miNombre_ retener];
}
}
Básicamente, la versión atómica tiene que tomar un candado para garantizar la seguridad del hilo, y también está aumentando el recuento de referencia en el objeto (y el recuento de liberación automática para equilibrarlo) de modo que se garantice que el objeto exista para la persona que llama, de lo contrario es una posible condición de carrera si otro subproceso está configurando el valor, lo que hace que el recuento de referencias caiga a 0
En realidad, hay una gran cantidad de variantes diferentes de cómo funcionan estas cosas dependiendo de si las propiedades son valores u objetos escalares, y cómo interactúan los elementos de retención, copia, solo lectura, no atómico, etc. En general, los sintetizadores de propiedades simplemente saben cómo hacer “lo correcto” para todas las combinaciones.
Para más ref