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