【问题标题】:Memory Leaks cocos2D - spriteWithSpriteFrameName内存泄漏 cocos2D - spriteWithSpriteFrameName
【发布时间】:2012-08-21 19:28:57
【问题描述】:

请帮帮我.. 我是 cosos2D 游戏开发的新手。 在仪器中,我在以下代码中的 spriteWithSpriteFrameName 处的游戏中发现了泄漏..

tileArray=[[CCArray alloc]initWithCapacity:11];
for (int i=1; i<=10; i++) {
@autoreleasepool {
CCSprite *encounter;
encounter = [CCSprite spriteWithSpriteFrameName:@"82x60.png"];
[self addChild:encounter z:i tag:2600+i];
encounter.position=CGPointMake(-1000,-1000);
[tileArray addObject:encounter];
}
}

尽快回复我。谢谢..

【问题讨论】:

  • 你会在任何地方发布你的 tileArray 吗?
  • 是在场景的dealloc方法中

标签: ios memory-leaks cocos2d-iphone


【解决方案1】:

在你的 onExit 方法中,清理 spritesheet,并从 self 中删除所有子元素。

-(void)onExit
 {
    [tileArray release];

    CCSpriteFrameCache *cache = [CCSpriteFrameCache sharedSpriteFrameCache];

    [cache removeSpriteFramesFromFile:@"yourSpriteSheet.plist"];

    [self removeAllChildrenWithCleanup:YES];

    [super onExit];


 }

【讨论】:

  • onExit 方法,如果我删除精灵帧,并再次调用调用相同的场景,那么我的应用程序将崩溃,说它无法找到那些精灵帧..即使在我使用的 init 方法中以下代码 CCSpriteFrameCache* frameCache = [CCSpriteFrameCache sharedSpriteFrameCache]; [frameCache addSpriteFramesWithFile:@"art.plist"];CCSpriteBatchNode* art = [CCSpriteBatchNode batchNodeWithFile:@"art.png"]; [self addChild:art z:0];
  • 在你的 onEnter 方法中添加它并在 onExit 方法中删除它。不要在你的场景初始化中访问它。将您的所有代码从 init 移动到 onEnter。
  • 按照您的建议,我将所有代码从 init 移至 onEnter 方法,并且我的应用没有崩溃,但泄漏问题仍然存在..
  • @rishabhjain86,使用 cocos2D obj.C 对,那么要使用 @autoreleasepool 吗?他们已经在 lib 中使用了它。所以删除它并尝试。
  • 我也试过了,但它也不起作用..上面代码中的每个精灵都会产生 432KB 的泄漏。
【解决方案2】:

您的 tileArray 未发布,这就是您泄漏的原因。只需将其设置在自动释放池中......

tileArray=[[[CCArray alloc]initWithCapacity:11] autorelease];

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    相关资源
    最近更新 更多