Я использую методы 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 / Какао?