我正在尝试在ARC环境中使用Box2D。下面是我如何使用__bridge
将ObjC指针传递给非ObjC空间。但在我看来并不合法,因为sprite
var可以解除分配。
- (void)addBoxBodyForSprite:(CCSprite *)sprite
{
b2BodyDef spriteBodyDef;
...
spriteBodyDef.userData = (__bridge void*)sprite;
b2Body *spriteBody = _world->CreateBody(&spriteBodyDef);
...
spriteBody->CreateFixture(&spriteShapeDef);
}
这是我将同一个精灵从非ObjC转移到ObjC空间的方法,这次是使用__bridge _transfer
。
-(void)update:(ccTime)dt
{
...
CCSprite *sprite = (__bridge_transfer CCSprite *)b->GetUserData();
...
}
我还释放使用DestroyBody(...)
取消分配正文,其中包含精灵参考,而不是专门删除userData
,因为我假设正文比精灵长寿。
问题是使用上述桥梁是否合法。
答案 0 :(得分:0)
要在结构中存储Objective-C对象,请使用struct.val = CFBridgingRetain(val)
。访问该值时,请使用id val = (__bridge id)struct.val
。要释放它,请使用CFRelease(struct.val)
。