Условное выделение/распределение? [Объектив-c и Cocos2D]

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

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

    // 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 должен сохранить ссылку, чтобы он мог прокручиваться вместе с картой. Но если я не выделяю его, как я НЕ освобождаю его?


person Chewie The Chorkie    schedule 28.06.2011    source источник
comment
Что вы подразумеваете под Cocos2D необходимостью сохранить ссылку? Создает ли он экземпляр переменной для своей собственной цели?   -  person Deepak Danduprolu    schedule 28.06.2011
comment
Ага. Если я отпущу rushH и rushV сразу после установки позиций, игра запустится нормально, но если я сдвину карту, она сразу вылетит. Нигде в моем собственном коде я не ссылаюсь на эти объекты, пока игрок не столкнется с ними на карте, поэтому Cocos2D должен использовать ссылки на них, чтобы заставить rushH и rushV двигаться вместе с картой.   -  person Chewie The Chorkie    schedule 28.06.2011
comment
Почему бы вам не проверить, являются ли rushH и rushV nil, прежде чем выделять их? Зарегистрируйте их.   -  person Deepak Danduprolu    schedule 28.06.2011


Ответы (2)


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

person Deepak Danduprolu    schedule 28.06.2011
comment
Итак, вы говорите, что если я не выделю объект, а выпущу его в делелоке с тем же именем, это не будет иметь никакого эффекта? - person Chewie The Chorkie; 28.06.2011
comment
да. Это верно для переменных экземпляра, а не для переменных метода. Переменные метода не являются nil по умолчанию. Переменные экземпляра. - person Deepak Danduprolu; 28.06.2011

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

person Perception    schedule 28.06.2011
comment
Проверка nil не нужна — можно безопасно отправить сообщение release на nil. - person mipadi; 28.06.2011
comment
Вы могли бы сделать это ... Я считаю это неряшливым кодом и по возможности избегаю его. - person Perception; 28.06.2011
comment
Да, но тогда вы просто добавляете больше кода, который ничего не делает, верно? - person Chewie The Chorkie; 28.06.2011