como usted sabe, el contenedor/colección no se garantiza que sea seguro para subprocesos. ¿Qué podría suceder si cambia la matriz al copiar o leer? un montón de cosas. los casos obvios son que puede estar reasignando en el momento, puede pasar o devolver una referencia no válida (por ejemplo, la más reciente eliminado), o puede acceder a los objetos que han sido liberados (desde otro hilo). Además de las cosas que harán que su aplicación se bloquee o cause otro UB, es posible que no devuelva valores correctos o consistentes. es una mala interpretación de los datos. ninguno es bueno
usted no prueba el escenario - los problemas de enhebrado son difíciles de reproducir y realmente nunca puede cubrir todos los casos. dado que el objeto en sí mismo no garantiza la seguridad del hilo: su implementación tiene que restringir los accesos/mutaciones/interacciones a un hilo a la vez. al tratar con objetos que se utilizan en contextos de multiproceso: cada vez que accede o consulta información del estado mutable de un objeto, debe proteger el objeto (por ejemplo, con un bloqueo). por lo tanto, simplemente lo bloquea mientras lo usa. bloquear/copiar/desbloquear/usar la copia también es común. para un NSMutableArray, ejemplos de estado mutable serían todos sus objetos y su conteo. sus operaciones y mutaciones también usan el estado mutable del objeto, por lo que están restringidas.
si solo utiliza este objeto de un hilo, obviamente no es necesario que lo bloquee. esta es también una razón por la que pasar por copiar y mantener variantes inmutables son ambas buenas ideas en la mayoría de los casos.no necesita un candado para cada objeto, un protector para el objeto que lo sujeta es a menudo una buena forma de diseñar una clase para la seguridad del hilo.
actualización
... ¿Qué ocurre? ¿La copia contiene los 5 objetos (ya que se conservan en otras partes de todos modos? ¿Contienen 4? (Aun que contiene 4 es suficiente para mí) es una excepción lanzada?
si no se ha guardado correctamente la colección, es . tan bueno como un comportamiento indefinido y tiene suerte si se bloquea
es necesario tomar las precauciones adecuadas para evitar un comportamiento no definido su programa está funcionando en ese dominio cuando no está adecuadamente protegidas
dar más detalles..: retener los objetos externamente solo reduce la probabilidad de un comportamiento indefinido \ ior, pero ciertamente no lo elimina. Los ejemplos de consecuencias incluyen excepciones, segmentaciones seguras, lectura o escritura de memoria que se usa como otra asignación activa (que puede aparecer como un problema muy misterioso que también puede ser virtualmente imposible de reproducir).
Lo aliento a protegerse adecuadamente o tomar otro enfoque. UB es MALO :)
Tuve un problema similar hace dos días, pero estaba eliminando elementos de una matriz y enumerando en otra. Obtuve una excepción sobre la matriz que se está modificando. Si arrayWithArray: usa enumeración rápida (no lo sé) arrojará una excepción. –
¡Creo que entiendes mi problema! Estoy tratando de determinar si se lanzará una excepción. Pero no puedo crear una prueba para verificar esto porque no puedo coordinar otra secuencia para modificar la matriz mientras se realiza una copia. – xcoder