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