потерял со слабой связью obj-c и т. д. - PullRequest
0 голосов
/ 23 марта 2012

Я новичок в этом и понятия не имею, сейчас я кое-что прочитал, но почему-то все они, похоже, не объясняют этого.

Я работаю над игрой, чтобы войти в нее, но каким-то образом я теряюсь в этом.

GameScene.h имеет следующие объявления в интерфейсе:

Player *player; 
b2Body *b2PlayerBody;

внутри GameScene.mm (используя box2d, так что нужно .mm), когда в функции я создаю игрока (который происходит из другого класса) я установил этот b2PlayerBody в тело, которое я использовал, чтобы передать его игроку класс и работа с ним.

-(void) addPlayerAtPosition:(CGPoint)p
{
    CCLOG(@"Adding player at %0.2f x %02.f",p.x,p.y);

    // Player
    player = [[Player alloc] initWithPosition:ccp(p.x, p.y)];
    player.anchorPoint = ccp(0,0.5);
    [self addChild:player z:10 tag:kTagPlayerNode];



    // Define the dynamic body.
    //Set up a 1m squared box in the physics world
    b2BodyDef bodyDef;
    bodyDef.type = b2_dynamicBody;
    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);
    b2PlayerBody = world->CreateBody(&bodyDef);

    // Define another box shape for our dynamic body.
    b2PolygonShape dynamicBox;
    dynamicBox.SetAsBox(.5f, .5f);//These are mid points for our 1m box

    // Define the dynamic body fixture.
    b2FixtureDef fixtureDef;
    fixtureDef.shape = &dynamicBox; 
    fixtureDef.density = 1.0f;
    fixtureDef.friction = 0.3f;
    b2PlayerBody->CreateFixture(&fixtureDef);
    [player setPhysicsBody:b2PlayerBody];
}

В моем методе Update этого файла я вызываю (dt is delta):

[player update:dt withBody:b2PlayerBody]; //update player

В файле player.h у меня есть: Склонение за

- (void)update:(ccTime)dt withBody:(b2Body *)body;

и внутри файла player.mm у меня есть

- (void)update:(ccTime)dt withBody:(b2Body *)body {

}

При запуске происходит сбой при обновлении с GameScene.mm без текста ошибки

[player update:dt withBody:b2PlayerBody]; //update player

Что я делаю не так?

Также может кто-нибудь объяснить мне, в чем разница (извините, если это глупый вопрос) между

b2Body * b2PlayerBody; b2Body * b2PlayerBody; // Я знаю, что это слабое звено, но в чем разница. b2Body b2PlayerBody;

также влияют ли эти методы ссылки на освобождение памяти в методе release?

1 Ответ

0 голосов
/ 24 марта 2012
b2Body * b2PlayerBody;
b2Body* b2PlayerBody;
b2Body *b2PlayerBody;

Переменные экземпляра (в данном случае указатели) без ключевых слов управления памятью (соответственно, свойство "assign") называются "слабыми ссылками". Размещение звездочки не имеет значения и является просто соображением того, какой стиль вы предпочитаете. Лично я предпочитаю звездочку рядом с типом данных, а не переменную.

Слабое связывание относится только к статическим библиотекам, т. Е. Вы можете использовать «слабую ссылку» на Game Center, чтобы приложение работало на устройствах без Game Center. В этом случае вы должны убедиться, что приложение не вызывает методы GC на устройствах без GC.

Эти объявления не влияют на управление памятью. Вы несете ответственность за распределение и освобождение переменных экземпляра по мере необходимости. В этом случае это делается через API Box2D, то есть с помощью методов CreateBody и DestroyBody.

...