Итак, я пытаюсь использовать метод CoreAudio AUGraphAddRenderNotify(...)
, но мне нужна ссылка на класс, который создал это уведомление в блоке уведомлений. Поскольку это C функция, я не могу просто добавить [weak self] in
захват закрытия. Глядя на документацию , последним параметром этого метода может быть UnsafeMutableRawPointer
, который будет передан во время выполнения блока в качестве первого параметра. Следуя этому предложению , вот мой код:
let selfPointer = Unmanaged.passUnretained(self).toOpaque()
AUGraphAddRenderNotify(graph, { (audioPlayerPointer, _, _, _, _, _) -> OSStatus in
let audioPlayer = Unmanaged<AudioPlayer>.fromOpaque(audioPlayerPointer).takeUnretainedValue()
...
return noErr
}, selfPointer)
Вот мой вопрос: Мне нужно выяснить, как можно безопасно получить значение за этим указателем (учитывая ноль). В частности, я хочу получить безопасный доступ к audioPlayer и убедиться, что он не был освобожден к моменту его использования. В настоящее время все работает нормально, пока audioPlayer не будет освобожден, а затем мое приложение не будет работать. Я знаю, что могу использовать AUGraphRemoveRenderNotify(...)
, чтобы остановить уведомление до того, как объект будет освобожден, но, к сожалению, этот метод не тот, который я ищу. Как я могу проверить, был ли освобожден объект, на который указывает указатель?
Заранее спасибо!