OS X: как правильно соединить указатель релиза с __bridge_transfer
У меня есть блок-объект, который преобразуется в void *
указатель для передачи в библиотеку C. Я развертываю на OS X 10.6 так CFBridgingRetain
а также CFBridgingRelease
не доступны
Вместо этого я делаю:
void ptr_retain(void (^block)()) {
void *ptr = (__bridge_retained void *)(block);
...
// pass ptr to C lib
}
void ptr_release(const void *ptr) {
// C lib calls this function
void (^block)() = (__bridge_transfer void(^)())ptr;
}
Вопрос: в ptr_release я получаю предупреждение "неиспользуемая переменная". Я обеспокоен тем, что компилятор может оптимизировать __bridge_transfer
линия и блок никогда не будут освобождены. Может ли это случиться? Даже если это не так, это правильный способ сообщить ARC, чтобы освободить блок в конце ptr_release
?
1 ответ
Когда вы используете __bridge_retained
или же CFBridgingRetain()
, вы получите указатель со счетом +1. Вы несете ответственность за выпуск этой ссылки.
Вы можете освободить ссылку, передав право собственности обратно в ARC (используя __bridge_transfer
или же CFBridgingRelease()
), или вы можете просто позвонить CFRelease()
,
В вашем случае просто используйте CFRelease()
:
void ptr_release(const void *ptr) {
CFRelease((CFTypeRef)ptr);
}