Objective c 有条件分配/解除分配?[目标-c和Cocos2D]
如果我想在另一个类中分配一个类,并且我想很容易地引用它,但有时这个类不需要分配,因此不需要解除分配,该怎么办。这是怎么做到的?我可以在dealloc中添加一个条件,这样就不必发布它吗 更详细地说,我使用的是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
// 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是否为零?记录它们。