Spec-Zone.ru › GCC 7

8.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() добавляет или удаляет этот спецификатор в строковое описание типа переменной экземпляра, указанной в качестве аргумента.

Далее: Константные строковые объекты, Предыдущее: Кодирование типов, Вверх: Objective-C [Оглавление][Индекс]

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

Spec-Zone.ru

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