8.4 Сбор мусора
Этот раздел специфичен для GNU Objective-C runtime. Если вы используете другой runtime, можете его пропустить.
Поддержка сбора мусора в GNU runtime была добавлена с использованием мощного консервативного сборщика мусора, известного как консервативный сборщик мусора Boehm-Demers-Weiser.
Для включения поддержки необходимо настроить компилятор, используя дополнительный аргумент, --enable-objc-gc. Это позволит скомпилировать библиотеку boehm-gc и дополнительную библиотеку runtime, которая имеет несколько улучшений для поддержки сборщика мусора. Новая библиотека получила новое имя libobjc_gc.a, чтобы не конфликтовать с библиотекой, не использующей сбор мусора.
При использовании сборщика мусора объекты выделяются с использованием так называемого механизма типизированного выделения памяти, доступного в сборщике Boehm-Demers-Weiser. Этот режим требует точной информации о расположении указателей внутри объектов. Эта информация вычисляется один раз на класс, сразу после инициализации класса.
Существует новая функция runtime 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-5.5.0/gcc/Garbage-Collection.html