释放NSMutableArray对象

时间:2009-09-03 17:16:48

标签: objective-c nsarray

这是我的'tick'功能:

- (void) tick: (ccTime) dt
{

 NSLog(@"%d",ticker);
 if(fbut.Adown == YES && ticker > 4)//fbut is a button
 {


  elayer = [[effectsLayer alloc] init]; // each effectlayer draws a //projectile that moves forward 'x' ticks

   elayer.e_playpos = glayer.playerpos; // player position
  [self addChild:elayer z:2];

  [mutable addObject: elayer];
 [elayer release];

  if(mutable.count > 20) // when there are 20 projectiles drawn, start //destroying the last one. 
  {
  NSLog(@"mutable: %d", mutable.count);

   [mutable removeLastObject];
  }  

  ticker=0;
 }
 ticker++;


// .  .  .

这就是正在运行的程序的样子

http://screencast.com/t/LpNHL2kJIVpu

看起来超过20 ..

但有趣的是,数组在20个对象上保持稳定。所以,如果对象被“删除”(通过[mutable removeLastObject];)它们怎么出现在屏幕上?

这是下一个泡菜...

现在我改变init以保留(寻找*****的)

- (void) tick: (ccTime) dt
{

 NSLog(@"%d",ticker);
 if(fbut.Adown == YES && ticker > 4)//fbut is a button
 {


  elayer = [[effectsLayer alloc] retain]; // *********each effectlayer draws //a projectile that moves forward 'x' ticks

   elayer.e_playpos = glayer.playerpos; // player position
  [self addChild:elayer z:2];

  [mutable addObject: elayer];
 [elayer release];

  if(mutable.count > 20) // when there are 20 projectiles drawn, start //destroying the last one. 
  {
  NSLog(@"mutable: %d", mutable.count);

   [mutable removeLastObject];
  }  

  ticker=0;
 }
 ticker++;


// .  .  .

现在没有效果图层被绘制,但NSArray仍然拥有21 - 20个对象。所有这些对象都是未初始化的。所以我添加了init到最后: elayer = [[[effectLayer alloc] retain] init];

现在我的效果与之前相同。

所以我尝试autorelease .. 相同的效果,很多很多的皮尤长相,超过20个。

我的目标是一次只能绘制20个,一旦绘制20个,它们就会被释放。现在,在没有重新分配的情况下,程序运行正常,直到大约2000个e层并且fps大约为5时,大约4分钟。

为什么这艘船没有合适?

(顺便说一句,我使用的是cocos2d框架)这个项目的版权归我所有,alex earley 2009。

1 个答案:

答案 0 :(得分:7)

首先,[[effectsLayer alloc] retain]很糟糕。永远不要那样做。永远。切勿使用尚未初始化的已分配对象。此外,这将保留对象至少两次,因为对+ alloc的调用会返回一个保留对象,并且您再次保留它,然后将其添加到数组(第三次保留它) ),但它只被释放两次(当它从数组和你的单一版本中删除时)。

我怀疑问题在于这一行:[self addChild:elayer z:2];这种方法有什么作用?它是否负责将真空吸引到屏幕上?如果是这样,那么这意味着它可能还会保留elayer,这意味着它不会被释放,因为当你从可变数组中弹出东西时,你似乎没有做任何类型的“removeChild”调用。

简而言之:只是因为某些内容不再出现在您的阵列中并不意味着它也不在屏幕上。