0

我正在尝试在 ARC 环境中使用 Box2D。下面是我如何使用__bridge. 但在我看来这并不合法,因为spritevar 可以被释放。

- (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();
    ...
}

我还 deallocate useDestroyBody(...)来释放 body,其中包含 sprite 引用而不是专门删除userData,因为我假设 body 比 sprite 寿命更长。

问题是使用上面的桥梁是否合法。

4

1 回答 1

0

要将 Objective-C 对象存储在 stuct 中,请使用struct.val = CFBridgingRetain(val). 访问值时,使用id val = (__bridge id)struct.val. 要释放它,请使用CFRelease(struct.val).

于 2013-08-22T01:18:46.487 回答