Les propriétés atomiques sont nécessaires dans un environnement multi-thread compté de référence afin d'empêcher la disparition des objets avant qu'un thread ait une chance de les conserver.
la mise en œuvre naïve Tenir compte d'un accesseur get:
@interface MyObject : NSObject
{
id myPropertyIVar;
}
-(id) myProperty;
@end
@implementation MyObject
-(id) myProperty
{
return myPropertyIvar;
}
// other stuff
@end
Tout cela est bien, sauf que si vous relâchez l'instance de MyObject avant de retenir la valeur retournée par -myProperty la valeur retournée peut bien être désallouée. Pour cette raison, il est plus sûr de mettre en œuvre -myProperty comme ceci:
-(id) myProperty
{
return [[myPropertyIvar retain] autorelease];
}
Ceci est maintenant complètement en sécurité dans un seul environnement fileté.
Malheureusement, dans un environnement multithread, il existe une condition de concurrence. Si le fil est interrompu à tout moment avant Retain a incrémentée Retain comte, que ce soit de ce qui suit vous fera recevoir un pointeur d'ordures:
- l'instance de MyObject est libéré et désallouée par un autre thread provoquant la Ivar être libéré et désallouée
- myProperty est réaffecté par un autre thread provoquant l'ancienne version à être libéré et désallouée
pour cette raison, tous les accès à la propriété doivent être protégés par un verrou. L'accesseur get ressemble à ceci.
-(id) myProperty
{
// lock
return [[myPropertyIvar retain] autorelease];
// unlock
}
Le accesseur set est également protégé, et ainsi est la libération dans -dealloc
Voici répondre http://stackoverflow.com/a/32942413/1961064 –