Как реализуется поведение обнуления слабого указателя ARC? - PullRequest
12 голосов
/ 14 января 2012

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

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

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

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

Ответы [ 2 ]

18 голосов
/ 14 января 2012

Это объясняется здесь:

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

Спойлер:

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

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

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

2 голосов
/ 30 октября 2015

Реализуется глобальной хэш-таблицей во время выполнения.Apple, источник: https://opensource.apple.com/source/objc4/objc4-647/runtime/objc-weak.mm

...