Objective c 有条件分配/解除分配?[目标-c和Cocos2D]

Objective c 有条件分配/解除分配?[目标-c和Cocos2D],objective-c,conditional,release,dealloc,alloc,Objective C,Conditional,Release,Dealloc,Alloc,如果我想在另一个类中分配一个类,并且我想很容易地引用它,但有时这个类不需要分配,因此不需要解除分配,该怎么办。这是怎么做到的?我可以在dealloc中添加一个条件,这样就不必发布它吗 更详细地说,我使用的是Cocos2D。我有可能需要分配或不需要分配的玩家能力等级。在我的初始化中: // Abilities if(abilityRushH == 0){ objects = [theMap objectGroupNamed:@"oj"]; start

如果我想在另一个类中分配一个类,并且我想很容易地引用它,但有时这个类不需要分配,因此不需要解除分配,该怎么办。这是怎么做到的?我可以在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需要保留引用,以便可以随地图滚动。但是如果我没有分配它,我怎么能不解除锁定呢?

确保可选变量在不需要时为零,并在解除锁定之前进行零检查。

确保可选变量在不需要时为零,并在解除锁定之前进行零检查。

既然您要在解除锁定时释放它,这将有一个实例变量。现在,当分配Objective-C类的任何实例时,其所有对象都是nil,C类型设置为0或等效值。因此,如果类的对象未实例化,则无需付出任何额外的努力,因为实例变量在dealloc时将为零,因此发送给它的释放消息将无效。

因为您正在谈论在dealloc中释放它,因此将有一个实例变量用于此。现在,当分配Objective-C类的任何实例时,其所有对象都是nil,C类型设置为0或等效值。因此,如果类的对象未实例化,则无需付出任何额外的努力,因为实例变量在dealloc时将为nil,因此发送给它的释放消息将无效。

无需进行nil检查-向nil发送释放消息是安全的。您可以这样做。。。我认为这是一个草率的代码,如果可能的话,避免它。是的,但是你只是添加了更多的代码,什么都不做,对吧?零校验是不必要的——发送一个释放消息到NIL是安全的。你可以这样做…我认为这是一个草率的代码,只要有可能就避免它。是的,但是你只是添加了更多的代码什么都不做,对吗?你是说如果我不分配一个对象,而是用相同的名字在DeloLoc中释放它,它就没有效果了吗?是的。这对于实例变量而不是方法变量是正确的。默认情况下,方法变量不是零。实例变量是。那么你是说如果我不分配一个对象,而是用相同的名称在dealloc中释放它,它将没有效果?是的。这对于实例变量而不是方法变量是正确的。默认情况下,方法变量不是零。实例变量是。Cocos2D需要保留引用是什么意思?它实例化变量是为了它自己的目的吗?是的。如果我在设定位置后立即释放拉什和拉什夫,游戏将开始顺利,但如果我移动地图,它将立即崩溃。在玩家与地图上的对象发生碰撞之前,我不会在我自己的代码中引用这些对象,因此Cocos2D必须使用它们的引用来使rushH和rushV随地图移动。为什么不在分配它们之前检查rushH和rushV是否为零?记录它们。你说Cocos2D需要保留引用是什么意思?它实例化变量是为了它自己的目的吗?是的。如果我在设定位置后立即释放拉什和拉什夫,游戏将开始顺利,但如果我移动地图,它将立即崩溃。在玩家与地图上的对象发生碰撞之前,我不会在我自己的代码中引用这些对象,因此Cocos2D必须使用它们的引用来使rushH和rushV随地图移动。为什么不在分配它们之前检查rushH和rushV是否为零?记录它们。