2

我有一個塊對象被轉換爲void *指針傳遞給C庫。我正在部署到OS X 10.6,因此CFBridgingRetainCFBridgingRelease不可用。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_retainedCFBridgingRetain()時,會得到一個帶+1保留計數的指針。您有責任釋放此參考。

您可以通過將所有權轉讓給ARC(使用__bridge_transferCFBridgingRelease())或只需致電CFRelease()來發布參考。

在你的情況下,只需使用CFRelease()

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