Spec-Zone.ru › GCC 9

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-9.5.0/gcc/Garbage-Collection.html

Spec-Zone.ru

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