2010-07-26 9 views

Respuesta

8

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

+0

Muchas gracias JeremyP. Realmente obtuve mucho de tu respuesta. – tek3

+0

No es la historia completa. :) Una propiedad atómica en realidad no garantiza la seguridad del hilo. Solo garantiza que obtendrá/establecerá un valor integral. – bbum

+0

@bbum: Ja, yo sabía que debería haber puesto eso también. En mi defensa, notará que ni siquiera he afirmado que las propiedades atómicas garantizan la seguridad de las hebras, solo que hace * posible * obtener una propiedad de forma segura en un entorno multiproceso. – JeremyP

2

Los documentos de Apple explicar todo esto muy bien. Para conocer las propiedades, incluida su atomicidad, lea this page.

+0

Este enlace está muerto, considerar la revisión. – borrrden

+0

2015 enlace está aquí: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html –