Как реализовано поведение слабых указателей с использованием ARC?
Я изучаю ARC. А теперь об обнулении слабых указателей.
Хорошо, я понял все возможности. Семантика слабой ссылки такая же, как и при слабой ссылке системы GC, но вы знаете, Objective-C не использует GC (кроме специального случая), поэтому я не могу понять, как это работает.
Я немного сложный парень, поэтому мне нужно знать основного принципала реализации, чтобы принять эту функцию. Но проблема в том, что очень трудно найти документ, в котором описывается принцип слабого указателя обнуления: (
IMO, единственный способ сделать эту работу - отслеживать и удерживать все указатели, ссылающиеся на себя во время выполнения, и устанавливать их все nil
, когда его ссылочный счет становится 0
. Но это выглядит слишком тяжело и глупо. Я считаю, что намного лучшее решение, используемое при реализации ARC.
Можете ли вы помочь мне найти документацию? Или прямое описание было бы более здоровым!
Ответы
Ответ 1
Здесь объясняется:
http://mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html
Спойлер:
Это работает в значительной степени, как вы думаете. Каждый класс поддерживает набор адресов слабых указателей, которые указывают на него, и когда его dealloc называется, он устанавливает их все в ноль.
Это может показаться немым, но это быстро, потому что в нем нет "отслеживания", ARC просто вставляет код, чтобы добавить указатель на этот набор каждый раз, когда объект назначен новой слабой ссылке.
Это на самом деле намного эффективнее, чем обман, связанный с сборкой мусора, который в основном включает прохождение через кучу на фоне потока, ищущего указатели, и сохранение запасов того, на что они указывают.
Ответ 2
Реализовано глобальной хэш-таблицей во время выполнения.
Источник Apple: https://opensource.apple.com/source/objc4/objc4-647/runtime/objc-weak.mm