Ответ 1
NSObject
, а также функции распределения объектов и сохранения счета являются потокобезопасными - см. Приложение A: Резюме безопасности потока в Руководство по программированию нитей.
Изменить. Я решил взглянуть на часть с открытым исходным кодом Core Foundation. В CFRuntime.c __CFDoExternRefOperation()
- это функция, ответственная за обновление счетчиков сохранения. Он проверяет, имеет ли процесс более одного потока, и если он имеет более одного потока, он получает блокировку спина перед обновлением счетчика удержания, что делает эту операцию безопасной.
Интересно, что счетчик сохранения не является атрибутом (или переменной экземпляра) объекта в смысле struct
(class). Время выполнения хранит отдельную структуру с удерживающими счетчиками. На самом деле, если я правильно ее понимаю, эта структура представляет собой массив хеш-таблиц, а для каждой хэш-таблицы - прямую блокировку. Это означает, что блокировка относится к нескольким объектам, которые были помещены в одну и ту же таблицу хэшей, то есть блокировка не является глобальной (для всех экземпляров) или экземпляром.