저는 Chipmunk 피직스 엔진을 사용하여 게임을 작성 중이며 모든 신체의 userData
필드에 Objective-C 오브젝트에 대한 포인터를 저장하고 싶습니다. 나는 id
과 void *
사이에 캐스팅 캐스팅 브리지를 사용할 필요가 알고 있지만, 나는 그것을하고있어 방법이 안전 확실하지 않다 :비 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*()
을 사용한다고 가정하십시오. UserData
은 NSObject
에서 파생되었으며 NSObject
은 list of toll-free bridged types에 없기 때문에 규칙을 어기는 것 같습니다.
CFBridgingRelease
을 호출하고 다른 Core Foundation 함수에 객체를 전달하지 않으므로 코드가 괜찮습니까? 아니면 Objective-C 객체를 C에서 내외로 전송해야하는 다른 방법이 있습니까?
아마도 브리지 캐스팅을 사용할 수도 있습니다. 설정하려면 : (__bridge void *) myData를 얻으려면 : (__bridge id) myData() –
@JasperBlues, 이는 'UserData' 객체가 적어도 이들'void * '참조 중 하나라도 존속하는 것이 보장되면 작동합니다. 그것은 CFBridgingRetain()이하는 반면에, 평생을 그렇게 확장시키지 않는다. –
@KenThomases - 아! 알았어. tute에 감사드립니다. –