【问题标题】:iPhone cocos2d sprites in array, memory problemsiPhone cocos2d sprites in array,内存问题
【发布时间】:2009-03-21 15:42:30
【问题描述】:

我正在尝试在数组中跟踪我的精灵,添加和删除 他们从层中,然后最后将它们从数组中清除。

我正在使用以下代码:

Sprite * Trees[50];
Layer * Forest;

Forest =  [Layer node];
Forest.isTouchEnabled = YES;
[self addChild:Forest z:30];

// do this a bunch of times
Trees[0] = [[Sprite spriteWithFile:@"mytree.png"] retain];
[Trees[0] setPosition:cpv(240,160)];
[Forest addChild:Trees[0] z:5];

然后当我想摧毁我使用的一棵树时:

[Forest removeChild:Trees[0] cleanup:YES];
[Trees[0] release];

我的问题是,当我查看 Instruments 时,我从不回收 那个记忆,从来没有退缩。我以为通过 释放精灵会释放内存。我在做这个吗 完全错了吗?

【问题讨论】:

    标签: iphone cocos2d-iphone sprite


    【解决方案1】:

    我知道当你使用 cocos2d 的模拟器时,内存看起来并没有被释放,所以你必须在设备上运行它才能准确了解正在发生的事情。

    here 关于 cocos2d 和内存的讨论很好。

    我注意到,您创建和保留的所有内容都必须释放,但在我这样做之前它不会从内存中释放:

    [[TextureMgr sharedTextureMgr] removeAllTextures]; 
    

    这将释放内存。

    这是一个更大的例子:

    Sprite * sPopup = [[Sprite spriteWithFile:@"popup.png"] retain];
        sPopup.position = cpv(240,440);
        [self addChild: sPopup z:2];
    [sPopup release];
    

    然后,当我在另一个函数中完成 sPopup 时,我有这个:

    [[TextureMgr sharedTextureMgr] removeAllTextures]; 
    

    内存被释放。

    【讨论】:

      【解决方案2】:

      我怀疑你是“过度”保留:

      Trees[0] = [[Sprite spriteWithFile:@"mytree.png"] retain];
      

      如果 Trees 是函数中的局部变量,如果 spriteWithFile 返回具有自动释放功能的 Sprite,则在这种情况下您不必保留。

      apple documentation discusses this further 中关于延迟释放的部分。总而言之,自动释放的接收者保证让对象在其范围内有效。如果您需要超出函数范围的对象(例如 Trees 是类的属性),那么是的,在这种情况下您需要一个保留(或者只是合成一个配置为保留的属性)。

      通过发出额外的保留,您的保留计数可能总是太高(永远不会达到 0),因此您的对象不会被垃圾回收。

      为了更好的衡量标准,我建议reviewing this paragraph as well that talks about the validity of objects

      【讨论】:

      • 我相信您的回答可能不正确。上面的代码中有两个retain,对应的有两个release。错误不在 Patrick 的代码中。
      • 我认为这取决于 spriteWithFile 的工作方式。按照惯例,大多数作为工厂的静态方法通过自动释放返回(至少 Apple 的所有 API 都这样做)。如果 spriteWithFile 返回一个调用了 autorelease 的 Sprite,他不需要保留。我相信他的代码中的保留计数总是 > 0,这就是内存没有被释放的原因。
      • 保留/释放计数是正确的,但是我建议使用 NSMutableArray 这样您就不需要额外的保留。
      【解决方案3】:

      即使您调用 [Trees[x] release],我相信您仍然需要从数组中“删除”该项目,例如 Trees[x] = nil 或其他内容,因为数组本身仍然包含该对象。

      Sprite 创建中的“保留”也不是必需的,因为 [Forest addChild:z:] 也会在其上放置保留(afaik)。

      【讨论】:

      • Tree 是一个数组,因此不会保留它存储的对象。因此无需从数组中删除它以释放内存。
      • 是的,这就是为什么我会在这种情况下使用 NS(Mutable)Array。
      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多