Подтвердить что ты не робот

Как реализовано поведение слабых указателей с использованием ARC?

Я изучаю ARC. А теперь об обнулении слабых указателей. Хорошо, я понял все возможности. Семантика слабой ссылки такая же, как и при слабой ссылке системы GC, но вы знаете, Objective-C не использует GC (кроме специального случая), поэтому я не могу понять, как это работает.

Я немного сложный парень, поэтому мне нужно знать основного принципала реализации, чтобы принять эту функцию. Но проблема в том, что очень трудно найти документ, в котором описывается принцип слабого указателя обнуления: (

IMO, единственный способ сделать эту работу - отслеживать и удерживать все указатели, ссылающиеся на себя во время выполнения, и устанавливать их все nil, когда его ссылочный счет становится 0. Но это выглядит слишком тяжело и глупо. Я считаю, что намного лучшее решение, используемое при реализации ARC.

Можете ли вы помочь мне найти документацию? Или прямое описание было бы более здоровым!

4b9b3361

Ответ 1

Здесь объясняется:

http://mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html

Спойлер:

Это работает в значительной степени, как вы думаете. Каждый класс поддерживает набор адресов слабых указателей, которые указывают на него, и когда его dealloc называется, он устанавливает их все в ноль.

Это может показаться немым, но это быстро, потому что в нем нет "отслеживания", ARC просто вставляет код, чтобы добавить указатель на этот набор каждый раз, когда объект назначен новой слабой ссылке.

Это на самом деле намного эффективнее, чем обман, связанный с сборкой мусора, который в основном включает прохождение через кучу на фоне потока, ищущего указатели, и сохранение запасов того, на что они указывают.