5

Мой вопрос в том, как текущие версии Foundation (или библиотеки времени выполнения Objective-C, так как это, кажется, есть), осуществляют сохранение количества для NSObject производных объектов? Как я мог видеть на NSObject.mm, в корпусе интерфейса NSObject нет ivar под названием retain count. Вместо этого, похоже, какая-то таблица или карта, которая содержит счетчики ссылок для каждого объекта. Но если удержание счета действительно выполняется с помощью карты, это не retain и release операции слишком дороги с такой реализацией (так как в этом случае необходимо блокировать и разблокировать мьютексы, искать карту, чтобы найти нужный объект, кроме того тот факт, что в многопоточной среде только один объект может быть сохранен/выпущен за раз)?Как сохранить счет в NSObject?

я не нашел, что связано с установкой сохранить счетчик 1 при выделении нового объекта, ни в _objc_rootAllocWithZone на NSObject.mm (который, кажется, функцию, которая вызывается [NSObject alloc]), ни в _class_createInstanceFromZone на objc-runtime-new.mm (который получает позднее - _objc_rootAllocWithZone).

+2

- (NSUInteger) retainCount {return rand()}; – CodaFi

+0

О, боже, я упустил прекращение, я не буду спать сегодня вечером. – CodaFi

ответ

10

Счет за NSObject действительно хранится на глобальной карте. IIRC фактически использует набор карт, которые разделены, предположительно, на основе адреса объекта, чтобы уменьшить конфликт блокировок, но фактическая информация о реализации - это просто детали реализации.

В любом случае вы не можете найти код, который устанавливает количество удержаний в 1, потому что его нет. Объекты с сохранением числа 1 не помещаются в карту. Объекты вводят только карту отсчета удержания, когда они начинаются с начального 1. retain. Это оптимизация, которая ускоряет общий случай объектов, у которых никогда не будет отсчета их удержания, минус 1.

+1

... со специальным случаем с метками указателей, которые вообще не имеют значения удержания. Сами данные кодируются внутри указателя, поэтому вы технически передаете их по значению, а не по ссылке (потому что ссылка является значением, и нет ничего реального за ссылкой). – Tommy

+0

Правда. И, конечно, любой класс, который переопределяет '-retain' и' -release', может свободно иметь собственную реализацию счета сохранения. Существует ряд классов, которые встраивают счет сохранения в качестве ivar, потому что они предпочитают ускорять 'keep' и' release' за счет наличия более крупного объекта. –

+0

Хорошо. Но почему они не используют ивара в качестве счетчика, что снизит стоимость сохранения/освобождения? Знаете ли вы, есть ли какие-либо особые причины для использования карт? – LuisABOL

Смежные вопросы