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_retained 또는 CFBridgingRetain()을 사용하면 +1 보유 횟수가있는 포인터가 표시됩니다. 이 참조 서를 공개 할 책임은 귀하에게 있습니다.

소유권을 ARC (__bridge_transfer 또는 CFBridgingRelease())로 다시 전송하여 참조를 해제하거나 CFRelease()으로 간단히 전화 할 수 있습니다. 귀하의 경우에는

, 단지 CFRelease() 사용

void ptr_release(const void *ptr) { 
    CFRelease((CFTypeRef)ptr); 
} 
관련 문제