Как правило, они предоставляют API для создания и выпуска ссылки.
Например, собственный интерфейс Java предоставляет глобальные ссылки, которые позволяют закреплять объект Java в памяти до тех пор, пока программа C не завершит его с помощью NewGlobalRef
и DeleteGlobalRef
NewGlobalRef
Создает новую глобальную ссылку на объект, на который ссылается аргумент obj.Аргумент obj может быть глобальной или локальной ссылкой.Глобальные ссылки должны быть явно удалены путем вызова DeleteGlobalRef()
, и он также предоставляет локальные ссылки, которые действуют только до тех пор, пока Java передала управление C для:
Локальные ссылки действительны в течение всего времени вызова нативного метода.Они освобождаются автоматически после возврата нативного метода.
API встраивания JVM предоставляет аналогичный механизм, который позволяет закреплять объект в памяти, пока программа C не определит, что это сделано сit.
API-интерфейс расширения Python C предоставляет API, аналогичный JNI.
Заимствованная ссылка может быть изменена на собственную ссылку путем вызова Py_INCREF()
.
Владелец ссылки отвечает за вызов Py_DECREF()
, когда ссылка больше не нужна.
Имена python отражают тот факт, что python использует подсчет ссылок *, ноAPI в основном такой же, как и в JNI, который основан на сборщике мусора без подсчета ссылок - у вас есть одна функция, которая закрепляет область памяти, управляемую интерпретатором, и функция, которая освобождает ранее закрепленную область обратно в интерпретатор.
* - python - это не настоящий подход к подсчету повторных ссылок.На той же странице «Хотя Python использует традиционную реализацию подсчета ссылок, он также предлагает детектор циклов, который работает для обнаружения циклов ссылок».