2010-07-26 9 views

Répondre

8

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

+0

Merci beaucoup JeremyP. J'ai vraiment glané beaucoup de votre réponse. – tek3

+0

Pas tout à fait l'histoire complète. :) Une propriété atomique ne garantit pas réellement la sécurité du thread. Cela garantit seulement que vous obtiendrez/définissez une valeur intégrale. – bbum

+0

@bbum: Ha, je savais que j'aurais dû mettre ça aussi. Pour ma défense, vous remarquerez que je n'ai même pas prétendu que les propriétés atomiques garantissent la sécurité des threads, mais seulement que cela rend * possible * d'obtenir une propriété en toute sécurité dans un environnement multithread. – JeremyP

2

Les docs d'Apple EXPLIQUER tout cela très bien. Pour en savoir plus sur les propriétés, y compris leur atomicité, lisez this page.

+0

Ce lien est mort, envisager une révision. – borrrden

+0

2015 lien est ici: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html –

Questions connexes