Spec-Zone.ru › GCC 11

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

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

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

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

Spec-Zone.ru

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