Spec-Zone.ru › GCC 4

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() добавляет или удаляет этот спецификатор в строковое описание типа переменной экземпляра, указанной в качестве аргумента.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Garbage-Collection.html

Spec-Zone.ru

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