2009-09-03 33 views
1

这是我的 '滴答' 功能:取消分配的NSMutableArray对象

- (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个对象。所有这些对象都是未初始化的。所以我添加初始化到最后: elayer = [[[effectsLayer的alloc]保留] INIT];

现在我已经从之前相同的效果。

,所以我尝试自动释放.. 同样的效果,很多很多的皮尤皮尤皮尤的,这样超过20

我的目标是只有20 alowed同时要绘制,一旦20他们被解除分配。眼下,随着释放出来,该程序运行正常,直到大约4分钟时,大约有2000ê层在与FPS是大约5 ..

为什么不该船座位座位吧?

(BTW读音字使用cocos2d的框架),这是由我受版权保护的一个项目,亚历克斯·厄雷2009年

回答

7

首先,[[effectsLayer alloc] retain]是可怕的。永远不要这样做。永远。切勿使用尚未初始化的分配对象。此外,这将保留对象至少两次,因为对+ alloc的调用返回一个保留对象,并且保留它,然后将它添加到数组(第三次保留它),但它只是获得两次释放(当它从阵列中删除时,以及你的单数版本)。

我怀疑,问题是这一行:[self addChild:elayer z:2];这是什么方法呢?它是否负责将屏幕真正拖到屏幕上?如果是这样,那么这意味着它可能还保留了elayer,这意味着它没有得到释放,因为你似乎没有做任何形式的“removeChild之”的呼吁飞出你的可变数组的东西的时候。

简而言之:仅仅是因为你的阵列中不再有东西并不意味着它不在屏幕上。

+1

即使'addChild:z:'不保留对象,但确实保留了引用,这意味着您仍然将该图层添加为子对象,但它有一天会崩溃,因为它已被'dealloc'编辑。 – Chuck 2009-09-03 17:41:57

+0

@Chuck +1非常真实。 – 2009-09-03 17:43:15

+1

此外,如果你不保持它“的addChild:”你会不会限制在20个项目,你只可能崩溃。 – bobDevil 2009-09-03 17:46:52