3

저는 Chipmunk 피직스 엔진을 사용하여 게임을 작성 중이며 모든 신체의 userData 필드에 Objective-C 오브젝트에 대한 포인터를 저장하고 싶습니다. 나는 idvoid * 사이에 캐스팅 캐스팅 브리지를 사용할 필요가 알고 있지만, 나는 그것을하고있어 방법이 안전 확실하지 않다 :비 CF 유형의 ARC를 전송할 때 일치하는 CFBridging 호출을 사용하는 것이 안전합니까?

// When body is created 
cpBody *body = cpBodyNew(...); 
UserData *userData = [[UserData alloc] init]; 
cpBodySetUserData(body, CFBridgingRetain(body)); 

... 

// When body is destroyed 
UserData *userData = cpBodyGetUserData(body); 
CFBridgingRelease(userData); 
cpBodyFree(body); 

이 코드가 작동하는 것 같다, 그러나 나는 또한했습니다 Core Foundation 유형에 무료 전화 연결이 가능한 객체에만 CFBridging*()을 사용한다고 가정하십시오. UserDataNSObject에서 파생되었으며 NSObjectlist of toll-free bridged types에 없기 때문에 규칙을 어기는 것 같습니다.

CFBridgingRelease을 호출하고 다른 Core Foundation 함수에 객체를 전달하지 않으므로 코드가 괜찮습니까? 아니면 Objective-C 객체를 C에서 내외로 전송해야하는 다른 방법이 있습니까?

+0

아마도 브리지 캐스팅을 사용할 수도 있습니다. 설정하려면 : (__bridge void *) myData를 얻으려면 : (__bridge id) myData() –

+2

@JasperBlues, 이는 'UserData' 객체가 적어도 이들'void * '참조 중 하나라도 존속하는 것이 보장되면 작동합니다. 그것은 CFBridgingRetain()이하는 반면에, 평생을 그렇게 확장시키지 않는다. –

+0

@KenThomases - 아! 알았어. tute에 감사드립니다. –

답변

5

안전합니다. NSObject은 일반 전화 CFTypeRef에 연결된 수신자 부담 전화입니다. 또한 void*에서 다른 핵심 기반 기능을 호출하지 않는다고 가정하기 때문에 중요하지 않습니다.

+0

빠른 답장을 보내 주셔서 감사합니다! NSObject가 [수신자 부담 브리징 유형 목록] (https://developer.apple.com/library/mac/documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/tollFreeBridgedTypes.html)에 없더라도 괜찮습니다. ? 우려를 명확히하기 위해 질문을 업데이트했습니다. – godel9

+3

다음은 Cocoa 프레임 워크 엔지니어의 성명서입니다 : http://www.cocoabuilder.com/archive/cocoa/95007-toll-free-bridging-of-nsobject.html#95680 –

+0

Perfect! 도움에 감사드립니다. – godel9