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);
}