Cuál es la diferencia entre las propiedades de Objective-C marcadas como atómicas y las marcadas como no atómicas?

El término atomicidad significa 'Todo o Nada'.

El concepto de atomicidad está relacionado con cómo responderá un trozo de código cuando sea ejecutado por múltiples hilos.

En iOS atómico y no atómico se refiere a la propiedad desde el punto de vista de la seguridad de los hilos. Cuando decimos que una propiedad es atómica significa que es segura para los hilos, cuando decimos que es no atómica significa que no es segura para los hilos.

¿Qué es la seguridad de los hilos?

Un trozo de código se llama seguro para los hilos si da resultados correctos incluso en un entorno multihilo, es decir, si es ejecutado simultáneamente por múltiples hilos daría un resultado correcto. La seguridad de los hilos significa que el código puede manejar múltiples hilos.

Declarar un objeto atómico tiene algunos gastos generales, por lo que en caso de que no esté utilizando ningún aspecto de roscado en su aplicación, es bastante seguro definir las propiedades como no atómicas.

En el momento en que definimos una propiedad como Strong, declaramos nuestra propiedad hacia ese objeto. ¿Qué significa esta propiedad? Significa que el compilador no destruirá ese objeto hasta que se lo indiquemos (esto era así en la época anterior al ARC, ahora el ARC se encargará de eliminar el objeto). Si declaramos dos objetos con referencias fuertes el uno al otro, nunca serán liberados ya que ambos son dueños del otro, por ejemplo, yo conduzco un coche BMW (la propiedad de mi coche es fuerte y está definida a BMW) y el coche BMW tiene una propiedad fuerte de conductor que es igual a mí. Esto significa que ambos somos propietarios el uno del otro y nunca se liberarán. Esto se conoce como ciclo de retención y debe ser evitado.

Una solución para el ciclo de retención es que necesitamos definir una de las propiedades como débil. Podemos tener un objeto como padre y otro como hijo. Por defecto, el padre debe tener una relación fuerte con los hijos y los hijos deben tener una relación débil con el hijo.

Se puede utilizar el atributo copy en lugar de strong, cuando damos definir un especificador como 'copy', se crea su copia y luego se posee. copy sólo se puede utilizar en los objetos que se suscriben al protocolo NSCopying. Como estamos creando una copia de la propiedad existente, el valor original no se modifica.

Retain, unsafe_unretained, assigned no se utilizan después de iOS 5.

En caso de que quieras exponer un valor de tu clase como propiedad pero no quieras que ninguna otra clase lo modifique, puedes marcarlo como de sólo lectura.