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