Quelle est la différence entre les propriétés Objective-C marquées comme atomiques et celles marquées non atomiques ?


Le terme atomicité signifie 'Tout ou rien'.

Le concept d'atomicité est lié à la façon dont un morceau de code va répondre lorsqu'il est exécuté par plusieurs threads.


Dans iOS atomique et non atomique fait référence à la propriété du point de vue de la sécurité des threads. Lorsque nous disons qu'une propriété est atomique cela signifie qu'elle est thread safe , lorsque nous disons qu'elle est non-atomique cela signifie qu'elle n'est pas thread safe.

Qu'est-ce que la thread safety ?

Un morceau de code est appelé thread safe s'il donne des résultats corrects même dans un environnement multi thread c'est-à-dire s'il est exécuté simultanément par plusieurs threads il donnerait un résultat correct. La thread safety signifie que le code peut gérer plusieurs threads.

Déclarer un objet atomique a quelques frais généraux, donc dans le cas où vous n'utilisez pas d'aspect threading dans votre app, il est assez sûr de définir les propriétés comme non atomiques.

Au moment où nous définissons une propriété comme forte, nous déclarons notre propriété envers cet objet. Que signifie cette propriété ? Cela signifie que le compilateur ne détruira pas cet objet jusqu'à ce que nous le lui disions (c'était vrai à l'époque pré-ARC, maintenant l'ARC se chargera de supprimer l'objet). Si nous déclarons deux objets avec des références fortes l'un à l'autre, ils ne seront jamais libérés car ils sont propriétaires l'un de l'autre. Par exemple, je conduis une voiture BMW (la propriété de ma voiture est forte et est définie par BMW) et la voiture BMW a une propriété forte de conducteur qui est égale à moi. Cela signifie que nous sommes tous deux propriétaires l'un de l'autre et que nous ne serons jamais libérés. Ceci est connu sous le nom de retain cycle et il devrait être évité .

Un correctif pour retain cycle est que nous devons définir l'une des propriétés comme faible. Nous pouvons avoir un objet comme parent et un autre comme enfant. Par défaut, le parent doit avoir une relation forte avec les enfants et les enfants doivent avoir une relation faible avec l'enfant.

L'attribut copy peut être utilisé au lieu de strong, lorsque nous donnons définir un spécificateur comme 'copy&apos ;, sa copie est créée et est alors possédée. copy ne peut être utilisé que sur les objets qui souscrivent au protocole NSCopying. Puisque nous créons une copie de la propriété existante, la valeur d'origine n'est pas modifiée.

Retain, unsafe_unretained, assigned ne sont plus utilisés après iOS 5.

Dans le cas où vous voulez exposer une valeur de votre classe en tant que propriété mais que vous ne voulez pas qu'une autre classe la modifie, vous pouvez la marquer en tant que read-only.