NSObject
così come l'assegnazione degli oggetti e le funzioni di conteggio dei fermi sono thread-safe - vedere Appendix A: Thread Safety Summary nello Thread Programming Guide.
Edit: ho deciso di dare uno sguardo alla parte open source del Nucleo Fondazione. In CFRuntime.c, __CFDoExternRefOperation()
è la funzione responsabile dell'aggiornamento dei contatori di ritenzione. Verifica se il processo ha più di un thread e, se c'è più di un thread, acquisisce uno spin lock prima di aggiornare il conteggio dei ritardi, rendendo quindi questa operazione sicura.
È interessante notare che il conteggio dei ritiri non è un attributo (o una variabile di istanza) di un oggetto nel senso struct
(classe). Il runtime mantiene una struttura separata con i contatori di ritenzione. Infatti, se ho capito bene, questa struttura è una matrice di tabelle hash e c'è un blocco di selezione per ogni tabella hash. Ciò significa che un lucchetto si riferisce a più oggetti che sono stati collocati nella stessa tabella hash, cioè il blocco non è globale (per tutte le istanze) né per istanza.
fonte
2011-01-17 13:29:21
Questo è corretto. Usa una strategia chiamata "lock striping" per ridurre la contesa sul blocco di mantenimento globale. Questo è ancora piuttosto lento, quindi se si dispone di un oggetto con un numero elevato di abbandoni, può essere utile implementare un sistema di conteggio personalizzato. Non è particolarmente difficile (usa OSAtomicIncrement() e gli amici), ma perderai la possibilità di ispezionare le cronologie dei conti in Strumenti per quegli oggetti. –