Я пытаюсь использовать Box2D в среде ARC. Ниже показано, как я передаю указатель ObjC в не-ObjC пространство, используя __bridge
, Но это не кажется мне законным, так как 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
потому что я предполагаю, что тело живет дольше, чем спрайт.
Вопрос в том, законно ли использование вышеуказанных мостов или нет.
Чтобы сохранить объект Objective C в структуре, используйте struct.val = CFBridgingRetain(val)
, при доступе к значению используйте id val = (__bridge id)struct.val
, Для его выпуска используйте CFRelease(struct.val)
,
Других решений пока нет …