как вы знаете, контейнер / сборник не гарантированно безопасен для потоков. Что может произойти, если вы измените массив во время копирования или чтения? много вещей. очевидные случаи состоят в том, что он может быть перераспределен в то время, он может передать или вернуть вам недопустимую ссылку (например, самую последнюю удаленную), или он может получить доступ к объектам, которые были освобождены (из другого потока). в дополнение к вещам, которые могут привести к сбою приложения или к другим UB, оно может не возвращать правильные или согласованные значения. это неверное толкование данных. ни те, ни другие хороши.
вы не тестируете сценарий - проблемы с потоками трудно воспроизвести, и вы действительно никогда не сможете охватить все случаи. поскольку сам объект не гарантирует безопасность потоков, ваша реализация должна ограничивать доступы / мутации / взаимодействия одним потоком за раз. при работе с объектом, который используется в многопоточном контексте: каждый раз, когда вы обращаетесь или запрашиваете информацию из изменяемого состояния объекта, вы должны защищать объект (например, с помощью блокировки). следовательно, вы просто блокируете его во время использования. блокировка / копирование / разблокировка / использование копии также распространено. для NSMutableArray примерами изменяемого состояния были бы все его объекты и его количество. его операции и мутации также используют изменяемое состояние объекта, поэтому они ограничены.
если вы используете этот объект только из одного потока, то, очевидно, не нужно его блокировать. это также причина, по которой передача в копии и хранение неизменяемых вариантов в большинстве случаев являются хорошими идеями. вам не нужна блокировка для каждого объекта, защита для объекта, который его удерживает, часто является хорошим способом разработки класса для безопасности потока.
Обновление
... Что происходит? Содержит ли копия все 5 объектов (поскольку они все равно хранятся в другом месте? Содержат ли они 4? (Даже для меня достаточно 4) Выдается ли исключение?
Если вы не защитили коллекцию должным образом, это так же хорошо, как неопределенное поведение, и вам повезло, если она вылетает.
вам необходимо принять соответствующие меры предосторожности, чтобы избежать неопределенного поведения. ваша программа работает в этом домене, если она не защищена должным образом.
, чтобы уточнить: сохранение объектов снаружи только уменьшает вероятность неопределенного поведения, но, конечно, не устраняет его. другие примеры последствий включают исключения, ошибки сегмента, память чтения или записи, которая используется в качестве другого активного выделения (что может показаться очень загадочными проблемами, которые также практически невозможно воспроизвести).
Я призываю вас охранять должным образом или использовать другой подход. UB ЗЛО:)