Qual è la differenza tra le proprietà Objective-C contrassegnate come atomiche e quelle contrassegnate come non atomiche?

Il termine atomicità significa 'Tutto o niente'.

Il concetto di atomicità è legato a come un pezzo di codice risponderà quando viene eseguito da più threads.

In iOS atomico e non atomico si riferisce alla proprietà dal punto di vista della sicurezza dei thread. Quando diciamo che una proprietà è atomica significa che è thread safe, quando diciamo che è non-atomica significa che non è thread safe.

Che cos'è la Thread Safety?

Un pezzo di codice è chiamato thread safe se dà risultati corretti anche in un ambiente multi threaded, cioè se viene eseguito simultaneamente da più threads, darà risultati corretti. Thread safety significa che il codice può gestire più threads.

Dichiarare un oggetto atomico ha alcuni overheads, quindi nel caso non stiate usando nessun aspetto di threading nella vostra applicazione, è abbastanza sicuro definire le proprietà come non atomiche.

Nel momento in cui definiamo una proprietà come Forte, dichiariamo la nostra proprietà verso quell'oggetto. Cosa significa questa proprietà? Significa che il compilatore non distruggerà questo oggetto finché non glielo diremo noi (questo era vero nei giorni pre-ARC, ora l'ARC si occupa di rimuovere l'oggetto). Se dichiariamo due oggetti con riferimenti forti l'uno all'altro, non saranno mai rilasciati perché sono entrambi proprietari l'uno dell'altro, ad esempio io guido un'auto BMW (la mia proprietà auto è forte ed è definita come BMW) e l'auto BMW ha una proprietà forte di driver che è uguale a me. Questo significa che entrambi siamo proprietari l'uno dell'altro e non saremo mai rilasciati. Questo è noto come retain cycle e dovrebbe essere evitato.

Una soluzione per retain cycle è che abbiamo bisogno di definire una delle proprietà come debole. Possiamo avere un oggetto come genitore e un altro come figlio. Per default, il genitore dovrebbe avere una relazione forte con i figli e i figli dovrebbero avere una relazione debole con il figlio.

L'attributo copy può essere usato al posto di strong, quando diamo definire uno specificatore come 'copy', la sua copia viene creata ed è quindi di proprietà. copy può essere usato solo su oggetti che sottoscrivono il protocollo NSCopying. Dato che stiamo creando una copia della proprietà esistente, il valore originale non viene cambiato.

Retain, unsafe_unretained, assigned non vengono utilizzati dopo iOS 5.

Nel caso in cui si voglia esporre un valore della propria classe come proprietà ma non si vuole che un'altra classe lo modifichi, è possibile contrassegnarlo come di sola lettura.