条件分配/释放? 【Objective-c与Cocos2D】
Posted
技术标签:
【中文标题】条件分配/释放? 【Objective-c与Cocos2D】【英文标题】:Conditional alloc/dealloc? [Objective-c and Cocos2D] 【发布时间】:2011-06-28 14:41:16 【问题描述】:如果我想在另一个类中分配一个类并且我想轻松引用它,但有时这个类不需要分配,因此不需要释放。这是怎么做到的?我可以在 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 需要保留引用,以便它可以随地图滚动。但是如果我不分配它,我怎么不释放呢?
【问题讨论】:
Cocos2D
是什么意思需要保留引用?它是否出于自己的目的实例化变量?
是的。如果我在设置好位置后立即释放 rushH 和 rushV,游戏会正常开始,但如果我移动地图,它会立即崩溃。在我自己的代码中没有引用这些对象,直到玩家在地图上与它们发生碰撞,所以 Cocos2D 必须使用它们的引用来使 rushH 和 rushV 随地图移动。
为什么不在分配rushH
和rushV
之前检查它们是否为nil
?记录它们。
【参考方案1】:
既然你说的是在dealloc
中发布它,那么这里会有一个实例变量。现在,当分配了 Objective-C 类的任何实例时,它的所有对象都是nil
,并且 c 类型设置为 0(或等效值)。所以如果你的类的对象没有被实例化,你不需要付出任何额外的努力,因为实例变量将是nil
dealloc
,所以发送给它的release
消息将无效。
【讨论】:
那你是说如果我不分配一个对象,而是在同名的dealloc中释放它,它就没有效果? 是的。这适用于实例变量而不是方法变量。方法变量默认不是nil
。实例变量是。【参考方案2】:
确保可选变量在不需要时为 nil,并在解除分配之前进行 nil 检查。
【讨论】:
nil
检查是不必要的——发送release
消息到nil
是安全的。
你可以这样做......我认为它是草率的代码并尽可能避免它。
是的,但是你只是添加了更多什么都不做的代码,对吧?以上是关于条件分配/释放? 【Objective-c与Cocos2D】的主要内容,如果未能解决你的问题,请参考以下文章
ios学习路线—Objective-C(堆(heap)和栈(stack))
[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第九章 内存管理