Las propiedades atómicas son necesarias en un entorno multihilo con recuento de referencia para evitar que los objetos desaparezcan antes de que un hilo tenga la posibilidad de retenerlos.
examinar la aplicación ingenua de un acceso get:
@interface MyObject : NSObject
{
id myPropertyIVar;
}
-(id) myProperty;
@end
@implementation MyObject
-(id) myProperty
{
return myPropertyIvar;
}
// other stuff
@end
Esto es todo bien, excepto que si libera la instancia de MiObjeto antes de retener el valor devuelto por -myProperty el valor devuelto bien puede ser desasignado. Por esta razón, es más seguro para implementar -myProperty así:
-(id) myProperty
{
return [[myPropertyIvar retain] autorelease];
}
Ésta es ahora completamente seguro en un único entorno de rosca.
Desafortunadamente, en un entorno multiproceso existe una condición de carrera. Si el hilo se interrumpe en cualquier momento antes de que la retienen ha incrementado la cuenta de retención, ya sea de la siguiente provocar que reciba un puntero de basura:
- la instancia de MiObjeto se libera y se cancela la asignación por otro hilo haciendo que el Ivar para ser lanzado y cancela la asignación
- myProperty es reasignado por otro hilo haciendo que la versión antigua para ser lanzado y desasignado
por esta razón, todos los accesos a la propiedad debe ser protegida por una cerradura. El acceso de get se parece a esto.
-(id) myProperty
{
// lock
return [[myPropertyIvar retain] autorelease];
// unlock
}
El acceso set es igualmente protegida y también lo es la liberación en -dealloc
Aquí está la respuesta http://stackoverflow.com/a/32942413/1961064 –