Условный alloc / dealloc? [Objective-c и Cocos2D] - PullRequest
0 голосов
/ 28 июня 2011

Что, если я захочу разместить класс внутри другого, и я хочу легко ссылаться на него, но иногда этот класс не нужно будет размещать, а следовательно, не делать. Как это сделать? Могу ли я поместить условную часть в dealloc, чтобы ее не нужно было выпускать?

Более подробно, я использую Cocos2D. У меня есть классы способностей игрока, которые могут или не могут быть распределены. В моем init:

    // Abilities
    if(abilityRushH == 0){
        objects = [theMap objectGroupNamed:@"oj"];
        startPoint = [objects objectNamed:@"item_ability_rushH"];
        x = [[startPoint valueForKey:@"x"] intValue];
        y = [[startPoint valueForKey:@"y"] intValue];

        rushH = [[RushHorizontal alloc] init];

        [self addChild:rushH.rushHSpriteSheet];

        rushH.rushHSprite.position = ccp(x,y);              
    }

    if(abilityRushV == 0){
        objects = [theMap objectGroupNamed:@"oj"];
        startPoint = [objects objectNamed:@"item_ability_rushV"];
        x = [[startPoint valueForKey:@"x"] intValue];
        y = [[startPoint valueForKey:@"y"] intValue];

        rushV = [[RushVertical alloc] init];

        [self addChild:rushV.rushVSpriteSheet];

        rushV.rushVSprite.position = ccp(x,y);  
    }

Cocos2D необходимо сохранить ссылку, чтобы он мог прокручивать карту. Но если я не распределяю это, как я НЕ освобождаю?

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Поскольку вы говорите о выпуске его в dealloc, для этого будет переменная экземпляра. Теперь, когда выделен любой экземпляр класса Objective-C, все его объекты nil, а типы c установлены в 0 (или эквивалентные значения). Таким образом, вам не нужно прилагать никаких дополнительных усилий, если объект вашего класса не был создан, поскольку переменная экземпляра будет nil в dealloc, и поэтому отправленное ему сообщение release не будет иметь никакого эффекта. *

0 голосов
/ 28 июня 2011

Убедитесь, что необязательная переменная равна nil, когда она не нужна, и выполните проверку на ноль, прежде чем делать освобождение.

...