条件分配/释放? 【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 随地图移动。 为什么不在分配rushHrushV 之前检查它们是否为nil?记录它们。 【参考方案1】:

既然你说的是在dealloc 中发布它,那么这里会有一个实例变量。现在,当分配了 Objective-C 类的任何实例时,它的所有对象都是nil,并且 c 类型设置为 0(或等效值)。所以如果你的类的对象没有被实例化,你不需要付出任何额外的努力,因为实例变量将是nildealloc,所以发送给它的release消息将无效。

【讨论】:

那你是说如果我不分配一个对象,而是在同名的dealloc中释放它,它就没有效果? 是的。这适用于实例变量而不是方法变量。方法变量默认不是nil。实例变量是。【参考方案2】:

确保可选变量在不需要时为 nil,并在解除分配之前进行 nil 检查。

【讨论】:

nil 检查是不必要的——发送release 消息到nil 是安全的。 你可以这样做......我认为它是草率的代码并尽可能避免它。 是的,但是你只是添加了更多什么都不做的代码,对吧?

以上是关于条件分配/释放? 【Objective-c与Cocos2D】的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 对象的分配/释放

ios学习路线—Objective-C(堆(heap)和栈(stack))

[学习笔记—Objective-C]《Objective-C-基础教程 第2版》第九章 内存管理

有人能告诉我在objective-c中保留和释放到底做了啥吗?

设置条件以避免双重释放分配的内存

为 Objective-C 数据对象分配内存的问题