NSObject
así como la asignación de objetos y las funciones de conteo de retención son seguras para la ejecución de subprocesos; consulte Appendix A: Thread Safety Summary en el Thread Programming Guide.
Editar: he decidido a echar un vistazo a la parte de código abierto de la Fundación Core. En CFRuntime.c, __CFDoExternRefOperation()
es la función responsable de actualizar los contadores de retención. Comprueba si el proceso tiene más de un hilo y, si hay más de un hilo, adquiere un bloqueo de giro antes de actualizar el conteo de retención, lo que hace que esta operación sea segura.
Curiosamente, el conteo de retención no es un atributo (o variable de instancia) de un objeto en el sentido struct
(clase). El tiempo de ejecución mantiene una estructura separada con contadores de retención. De hecho, si lo entiendo correctamente, esta estructura es una matriz de tablas hash y hay un bloqueo de giro para cada tabla hash. Esto significa que un bloqueo se refiere a múltiples objetos que se han colocado en la misma tabla hash, es decir, el bloqueo no es global (para todas las instancias) ni por instancia.
Eso es correcto. Utiliza una estrategia llamada "bloqueo de bandas" para reducir la contención en el bloqueo de retención global. Esto todavía es bastante lento, por lo que si tiene un objeto con un churn de recuento muy alto, puede valer la pena implementar un sistema de recuento personalizado. No es especialmente difícil (use OSAtomicIncrement() y sus amigos), pero perderá la capacidad de inspeccionar los historiales de recuento en Instrumentos para esos objetos. –