Как детерминистически освободить объект Core Foundation в среде «Сборка мусора»? - PullRequest
1 голос
/ 23 декабря 2009

Я использую методы Core Foundation в среде сбора мусора. Согласно документации вызов CFRelease просто уменьшает счетчик ссылок, но не освобождает объект:

Разница между средой для сбора мусора и средой с подсчетом ссылок заключается в сроках освобождения объекта. В среде с подсчетом ссылок, когда количество сохраняемых объектов падает до 0, оно немедленно освобождается; в среде со сборщиком мусора то, что происходит, когда число сохраняемых объектов в базовом фундаменте переходит от 1 к 0, зависит от того, где он находится в памяти:

  • Если объект находится в зоне malloc, он немедленно освобождается.
  • Если объект находится в зоне сбора мусора, последняя функция CFRelease () не сразу освобождает объект , она просто делает его пригодным для восстановления сборщиком, когда обнаруживается, что он недоступен - то есть, когда все сильные ссылки на это ушли. Таким образом, пока на объект все еще ссылаются из переменной экземпляра типа объекта (которая не была помечена как __weak), регистра, стека или глобальной переменной, он не будет собираться.

Иногда я открываю ресурс, который дорого держать, например, файл в сети:

CGImageSourceRef imageSource = CGImageSourceCreateWithURL(url, NULL);

Можно ли детерминистически освободить объект imageSource (закрыть, удалить, уничтожить, убить ублюдка), не дожидаясь сборщика мусора?

.Net Framework имеет интерфейс IDisposable, и я могу сделать это:

using (Font myFont = new Font("Arial", 10.0f))
{
    // use myFont
} // compiler will call Dispose on myFont

Есть ли что-то похожее в Objective-C / Какао?

Ответы [ 3 ]

2 голосов
/ 23 декабря 2009

См. Документы Apple по с использованием CoreFoundation со сборкой мусора . Версия TLDR: выделите объекты в kCFAllocatorMallocZone, чтобы исключить их из системы сбора мусора.

1 голос
/ 23 декабря 2009

Во-первых, CFImageSources, вероятно, не размещены в зоне сбора мусора. Так что вы, вероятно, в порядке, просто выпустив последнюю ссылку. (В основном, в зоне сбора мусора размещаются только объекты, созданные в Objective-C.)

Во-вторых, если хотите, вы можете просто загрузить данные с URL-адреса и открыть источник изображения из данных, если вам нужна гарантия, что ничего не будет открыто.

Прямого эквивалента интерфейса IDisposable не существует, но многие типы поддерживают закрытие вручную. CFImageSource, однако, не один из них.

0 голосов
/ 04 июня 2013

CFRelease - это путь к объектам CoreFoundation, у которых нет выделенных функций выпуска.

...