2

У меня есть объект блока, который преобразован в указатель void *, чтобы перейти в библиотеку C. Я развертываю OS X 10.6, поэтому CFBridgingRetain и CFBridgingRelease недоступны.OS X: Как правильно установить указатель на выпуск с __bridge_transfer

Вместо этого я делаю:

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?

ответ

3

Когда вы используете __bridge_retained или CFBridgingRetain(), вы получаете указатель со счетом сохранения +1. Вы несете ответственность за освобождение этой ссылки.

Вы можете освободить ссылку, передав право собственности обратно в ARC (используя __bridge_transfer или CFBridgingRelease()), или вы можете просто позвонить CFRelease().

В вашем случае, просто использовать CFRelease():

void ptr_release(const void *ptr) { 
    CFRelease((CFTypeRef)ptr); 
}