Перекрестные ссылки и сборка "мусора"

Я потратил слишком много времени на эту проблему, и мой коллега дал мне один прием в качестве обходного пути: просто сдвиньте стрелку Is initial view controller с контроллера навигации на встроенный контроллер вида следующим образом: enter image description here [ 114] Он отлично работает с VoiceOVer, потому что метка считывается только один раз НО контроллер навигации больше не учитывается (к сожалению, это уже не контроллер начального вида) [112 ].

Я пытался добавить заголовок и подсказку, но безрезультатно.

Тем не менее, я заметил, что проблема появилась, когда я запустил приложение из XCode на свое устройство, но исчез, когда я запустил приложение с моего устройства после установки .

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

11
задан Greg Hewgill 7 November 2008 в 08:39
поделиться

3 ответа

Как указано в этом ТАК вопрос, циклической ссылкой хорошо управляют.

Java не делает подсчета ссылок, он делает использование, прослеживающее сборку "мусора" (например, метка-и-развертка, копируя набор или некоторую комбинацию этого). Если следует за всеми активными ссылками для обнаружения, какие объекты "достижимы", и затем это очищает все остальное.

Ссылки в объектах, не самих достижимых, не влияют на достижимость, таким образом, не имеет значения, если они являются пустыми или нет.

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

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

Вы найдете больше деталей о недостижимом состоянии в Истине О Сборке "мусора":

Недостижимый

Объект вводит недостижимое состояние, когда больше сильных ссылок к нему не существует.
Когда объект недостижим, это - кандидат на набор.

Отметьте формулировку:
Просто, потому что объект является кандидатом на набор, не означает, что он будет сразу собран. JVM свободна задержать набор, пока нет неотложная потребность для thememory того, чтобы быть использованным объектом.

Важно отметить, что не только любая сильная ссылка будет содержать объект в памяти. Они должны быть ссылками, что цепочка от сборки "мусора" базируется. Корни GC являются специальным классом переменной, которая включает:

  • Временные переменные на стеке (любого потока)
  • Статические переменные (от любого класса)
  • Специальные ссылки из собственного кода JNI

Круговые сильные ссылки не обязательно вызывают утечки памяти. Рассмотрите код, создающий два объекта, и присваивает им ссылки друг на друга.

public void buidDog() {
   Dog newDog = new Dog();
   Tail newTail = new Tail();
   newDog.tail = newTail;
   newTail.dog = newDog;
}

Перед возвратами метода существуют сильные ссылки от временных переменных стека в buildDog метод, указывающий на обоих Dog и Tail.

После buildDog возвраты метода, Dog и Tail оба становятся недостижимыми от корня и являются кандидатами на набор (хотя VM не мог бы на самом деле собрать эти объекты для неопределенного количества времени).

19
ответ дан 3 December 2019 в 05:36
поделиться

Да - сборщик "мусора" может справиться с циклическими ссылками и т.д.

2
ответ дан 3 December 2019 в 05:36
поделиться

JVM воздействует на понятие "островов недостижимости". Если существует недостижимый 'остров' взаимосвязанных объектов затем, что набор объектов имеет право на сборку "мусора" в целом.

0
ответ дан 3 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: