2009-09-03 41 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