2009-09-03 6 views
1

これは私の 'ダニ' 関数であるオブジェクトしかし、配列は20個のオブジェクトで安定しているということです。したがって、オブジェクトが([mutable removeLastObject];によって)「削除されている」場合、どのように画面に表示されますか?ここで割当て解除NSMutableArrayのは

は、次のピクルスです...

は、今私は、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を一度に描画するalowedと20があり、一度持つことである、PEW PEWのPEW年代のとてもたくさん.. 同じ効果を自動解放してみてください描かれた彼らは割り当て解除されます。今のところ、割り当てを解除して、プログラムは約2000分のeレイヤーがあり、fpsが約5で約4分までOKです。

なぜ船がピューピューになりませんか?

(ちなみに私はcocos2dフレームワークを使用してM)これは私が著作権で保護されたプロジェクトである、アレックスのアーリー2009

答えて

7

まず、[[effectsLayer alloc] retain]がひどいです。絶対にしないでください。これまで初期化されていない割り当て済みオブジェクトを使用しないでください。さらに、+ allocの呼び出しによって保持されたオブジェクトが返され、それを再度保持してから配列に追加すると(3回目を保持するため)、これはオブジェクトを少なくとも2回のままにします。 2度リリースされています(アレイと単体リリースから削除されたとき)。

問題がこの行にあると思われます。[self addChild:elayer z:2];このメソッドは何をしますか?実際にエリートを画面に描くのは担当していますか?そうであれば、それはおそらくまた保持エライヤーを意味します。つまり、変更可能な配列から項目をポップするときに「removeChild」コールを実行しているように見えないため、割り当て解除されません。

単純に言えば、配列内に存在しないものがスクリーン上にないことを意味するわけではありません。

+1

そして、たとえ 'addChild:z:'がオブジェクトを保持していても何らかの形で参照を保持していたとしても、それはまだレイヤーを子として追加したことを意味しますが、 'dealloc' ed。 – Chuck

+0

@Chuck +1非常に真実。 –

+1

さらに、「addChild:」にそれを保持しないと、20項目に制限されず、クラッシュする可能性があります。 – bobDevil

関連する問題