Cocos2d:ARC过早发布CCSprite?

时间:2013-04-15 08:19:26

标签: cocos2d-iphone automatic-ref-counting

我为我的cocos2d项目启用了ARC。

现在我尝试执行以下操作:

   BuildTowerMenu *menu = [BuildTowerMenu menuAtLocation:tileScreenPos];

   [self addChild:menu];

在BuildTowerMenu类中:

+(id)menuAtLocation:(CGPoint)location {
   return [[self alloc] initMenuAt:location];
}

-(id) initMenuAt:(CGPoint)location {
    if (self = [super init]) {
      self.position = location;
      CCSprite *item1 = [CCSprite spriteWithFile:@"Icon.png"];
      item1.position = location;

      [self addChild:item1];
    }
    return self;
}

但出于某种原因,Sprite从未出现过。经过一些调试后,我看到当我从menuAtLocation返回时,CCSprite仍然在BuildTowerMenu的子数组中,但是为空(只有一个id)。

如果我实际上从外部添加了精灵,它就会起作用并显示Sprite:

BuildTowerMenu *menu = [BuildTowerMenu menuAtLocation:tileScreenPos];

CCSprite *item1 = [CCSprite spriteWithFile:@"Icon.png"];
item1.position = location;
[menu addChild:item1];

[self addChild:menu];

我在这里做错了什么提示?

P.S。:我在CCSprite的dealloc中添加了一个断点,它永远不会被调用(我想如果ARC发布它就应该调用它)...

2 个答案:

答案 0 :(得分:0)

我认为问题在于你为菜单和精灵设置了相同的位置。 我的意思是代码的这一部分

CGPoint location = ccp(200.f, 200.f);
[menu setPosition: location];
[sprite setPosition: location];
[menu addChild: sprite];

将添加您的精灵位置位置(400.f,400.f),重新连接到菜单的父级。你在BuildTowerMenu的initMenuAt:方法/

中做了几乎相同的事情

答案 1 :(得分:0)

已经对最初的问题发表了评论_: 好的,它与ARC无关;似乎被释放的Sprite就在那里,它只是一个调试器 - 没有正确显示它的bug。问题实际上是行self.position = location;在addChild之后移动setposition后,一切正常。