Spec-Zone.ru › GCC 10

Далее: Постоянные строковые объекты, Предыдущее: Кодирование типов, Вверх: Особенности 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-10.5.0/gcc/Garbage-Collection.html

Spec-Zone.ru

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