Spec-Zone.ru › GCC 15

9.4 Сборка мусора

Этот раздел относится только к среде выполнения GNU Objective-C. Если вы используете другую среду выполнения, можете пропустить его.

Поддержка сборки мусора в среде выполнения GNU добавлена с помощью мощного консервативного сборщика мусора, известного как консервативный сборщик мусора Boehm-Demers-Weiser.

Чтобы включить эту поддержку, необходимо настроить компилятор, указав дополнительный аргумент --enable-objc-gc. При этом будет собрана библиотека boehm-gc и дополнительная библиотека среды выполнения с рядом улучшений для поддержки сборщика мусора. Новая библиотека получила имя libobjc_gc.a, чтобы не конфликтовать с библиотекой без сборки мусора.

При использовании сборщика мусора объекты выделяются с помощью так называемого механизма типизированного выделения памяти, доступного в сборщике Boehm-Demers-Weiser. Этот режим требует точной информации о расположении указателей внутри объектов. Эта информация вычисляется один раз для каждого класса сразу после его инициализации.

В среде выполнения появилась новая функция class_ivar_set_gcinvisible(), которую можно использовать для объявления ссылки, так называемого слабого указателя. Такой указатель фактически скрыт от сборщика мусора; это может быть полезно в некоторых ситуациях, особенно если нужно отслеживать выделенные объекты, но при этом разрешить их сборку. Указатели такого типа могут быть только членами объектов: объявить глобальный указатель слабой ссылкой нельзя. Слабым указателем можно объявить любой тип-указатель, включая id, Class и SEL.

Ниже приведён пример использования этой возможности. Предположим, что вы хотите реализовать класс, экземпляры которого содержат ссылку на слабый указатель; следующий класс делает это:

@interface WeakPointer : Object
{
    const void* weakPointer;
}

- initWithPointer:(const void*)p;
- (const void*)weakPointer;
@end


@implementation WeakPointer

+ (void)initialize
{
  if (self == objc_lookUpClass ("WeakPointer"))
    class_ivar_set_gcinvisible (self, "weakPointer", YES);
}

- initWithPointer:(const void*)p
{
  weakPointer = p;
  return self;
}

- (const void*)weakPointer
{
  return weakPointer;
}

@end

Поддержка слабых указателей реализована с помощью нового спецификатора символьного кода типа, обозначаемого символом ‘!’. Функция class_ivar_set_gcinvisible() добавляет этот спецификатор в строку описания типа переменной экземпляра, указанной в качестве аргумента, или удаляет его из неё.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Garbage-Collection.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API