Objective c 解除分配NSMutableArray对象

Objective c 解除分配NSMutableArray对象,objective-c,nsarray,Objective C,Nsarray,这是我的“勾号”功能: - (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 e

这是我的“勾号”功能:

- (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++;


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

看起来有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=[[effectsLayer alloc]retain]init]

现在我有了和以前一样的效果

所以我尝试自动释放。。 同样的效果,很多很多的长椅长椅,超过20个

我的目标是一次只能抽出20个,一旦抽出20个,他们就被释放。现在,在没有释放的情况下,程序正常运行,直到大约4分钟后,大约有2000个e层,fps大约为5

为什么这艘船的座位不对

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

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

我怀疑这行代码有问题:[self addChild:elayer z:2];这个方法有什么作用?它是否负责将elayer实际绘制到屏幕上?如果是这样,那么这意味着它可能还保留了elayer,这意味着它不会被释放,因为当从可变数组中弹出内容时,您似乎没有执行任何类型的removeChild调用

简言之:某些东西不再出现在您的阵列中并不意味着它也不在屏幕上。

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

我怀疑这行代码有问题:[self addChild:elayer z:2];这个方法有什么作用?它是否负责将elayer实际绘制到屏幕上?如果是这样,那么这意味着它可能还保留了elayer,这意味着它不会被释放,因为当从可变数组中弹出内容时,您似乎没有执行任何类型的removeChild调用


简言之:某个对象不在数组中并不意味着它也不在屏幕上。

即使addChild:z:不保留对象,但以某种方式保留了引用,这只意味着您仍然将该层作为子层添加,但有一天它会崩溃,因为它已被解除分配。此外,如果您没有将其保留在“addChild:”中,您将不会限制为20项,您很可能会崩溃。哎呀,没有刷新注释。看看chuck,不是指即使addChild:z:没有保留对象,但以某种方式保留了一个引用,这只是意味着您仍然将层作为子对象添加,但有一天它会崩溃,因为它已被解除分配。此外,如果您在“addChild:”中没有保留它,您将不会限制为20项,您很可能会崩溃。哎呀,没有刷新评论。看看查克,不是我