Quale dovrebbe essere il modo migliore in un app iOS per evitare che una variabile di istanza venga modificata da un oggetto mentre un altro lo sta utilizzando?
Un buon vecchio blocco, come ad esempio pthread_mutex
; potresti anche utilizzare un wrapper Objective-C di questo (ad esempio NSLock
e NSRecursiveLock
). @synchronized
rientra anche in questa categoria, ma è il meccanismo di livello più elevato menzionato qui.
Ovviamente, le soluzioni concorrenti superiori in genere hanno più a che fare con le modifiche al design, il flusso del programma, favorendo l'immutabilità e così via. Ci saranno ancora casi in cui l'esclusione/blocco reciproco è preferito o richiesto.
Sfortunatamente, ObjC/Cocoa puro sono gravemente carenti in questo settore - lo sviluppo di un programma concorrente altamente efficiente utilizzando le tecnologie ObjC e Cocoa da solo è molto più difficile di quanto dovrebbe (o deve essere).
L'uso della direttiva @synchronized (auto) dovrebbe essere sufficiente?
Per casi semplici, è adeguato. È un livello oggetto Blocco ricorsivo.
Tuttavia, è piuttosto lento rispetto ad altre opzioni di esclusione reciproca.
Non credo @synchronized
ha molto da offrire, oltre a:
- convenienza per lo sviluppatore di introdurre (può avere cattivi effetti collaterali) e
- simmetria (che garantisce uno sblocco partite una serratura), riducendo notevolmente la probabilità di deadlock rispetto alle alternative (un attributo molto buono).
@synchronized
è conveniente, ma perché ha un costo elevato, va usata con giudizio.
è istanza var, non classe var .. e nessuno può dirti affidabilmente solo queste piccole informazioni –
È davvero una buona idea modificare una domanda ("variabile di classe" -> "variabile di istanza") se una * pensa * questo è ciò che intendeva l'OP? Leggendo la sua domanda precedente e la risposta, potrebbe essere che in realtà intendesse "variabile di classe". –
Scusate, colpa mia, avrei detto "variabile statica", è una bandiera il cui valore deve essere condiviso tra tutte le istanze della classe e assicurare che possa essere modificato solo da un'istanza a una determinata ora – AppsDev