Spec-Zone.ru › GCC 14

8.4 Сбор мусора

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

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

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

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

Существует новая функция runtime 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-13.3.0/gcc/Garbage-Collection.html

Spec-Zone.ru

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