2012-01-11 2 views
0

を更新した後、私は私のコードではcocos2d/Xcodeのオブジェクトがすぐに

にNSMutableArrayのを使用して非常に奇妙なエラーを持って更新されていない、私は

NSMutableArray *peasantArray; 

と別のNSMutableArrayのが含まれているNSMutableArrayの含むオブジェクトを持っていますオブジェクトB

予定更新機能では、本来次の機能である別の機能を呼び出しました: 私は、* peasantArray内のすべてのオブジェクトAをループし、任意の農民オブジェクトに変数var == GameEntityCommandIdlingがある場合は、2番目のNSMutableArray * treeArrayのオブジェクトBを変更します。

問題は、時には、私がpeasantArray内のオブジェクトAを変更した後、変更された変数(var)が、スケジュールされた方法で変数statusを出力することによってオブジェクトA内で修正/更新されている。次回のスケジュール(1/30s)でNSMutableArray * peasantArrayを再びループすると、古い変数/更新されていない変数(var)を持つオブジェクトAが再び見つかり、アルゴリズムが間違っている、

しかし、NSMutableArrayの* peasantArrayを通じてIループは1secondよりも、私が正しく更新された変数の値としてオブジェクトAのための変数(VAR)を参照してくださいだろうたびに、

は、どのようには限界がある少ない場合高速NSMutableArrayを反復処理できますか?ここ

は、私は基本的には今述べたコードのいくつかの作品は、

NSMutableArray *peasantArray; 
NSMutableArray *treeArray; 

.....

peasantArray = [[[NSMutableArray alloc] initWithCapacity:1]retain]; 
for(int i = 0; i < 1; i++) 
{ 
    Peasant *A = [[Peasant alloc] init]; 
    [peasantArray addObject:A]; 
} 

.... //更新の内側()

です
for (int i = 0;i < [peasantArray count];i++) 
{ 
    Peasant *A = [peasantArray objectAtIndex:i]; 
    if (A.status == something) 
    { 
     printf("A.status is something\n"); 
     A.status = sometingelse; 

     ... 
     //update other things not related to this NSMutableArray or object 
    } 
} 

.....

はSOエラーがそれの一方のみが印刷されなければならないが、時々私は、私は本当にすべての助けに感謝

おかげで、「A.statusが何かある」の複数のprintfを持っているということです

+0

どのようなタイプの 'status'ですか?それは 'NSString'ですか? – Anna

答えて

1

だから私はNSMutableArrayのを反復処理することができますどのくらいの速には限界がありますか?

間違いなく。それは私が今までに遭遇したアレイの最も愚かな実装でしょう。 :)

最も簡単な説明は通常は答えです。メッセージが複数回印刷されているとします。あなたはおそらく、複数の農民がその地位を何かに設定している可能性があることを確認しましたか?

そうでない場合は、ステータス更新が同じフレームで2回印刷され、2回の更新で2回印刷されないことを確認してください。

これまでのところ、1つの配列を反復して他の配列のオブジェクトを変更することの効果が何とか無効になっていることがわかりました。これにより、両方の配列に同じオブジェクトがある場合、配列Aのオブジェクトのプロパティを変更すると、配列Bに含まれる同じオブジェクトのプロパティも変更されます。

give breakpoints a(nother) tryがあります。この問題は、コードをステップ実行したときに見つけやすくなります。

+0

ありがとう、エラーはあなたの答えに多少似ています。私は間違って同じオブジェクトを変更しました変数(var)、 – user1143056

0

ここであなたはメモリリークを持っています

for(int i = 0; i < 1; i++) 
{ 
    Peasant *A = [[Peasant alloc] init]; 
    [peasantArray addObject:A]; 
} 

addObjectはオブジェクトに参照カウントを追加するので、配列に追加した後にAをリリースする必要があります。

for(int i = 0; i < 1; i++) 
{ 
    Peasant *A = [[Peasant alloc] init]; 
    [peasantArray addObject:A]; 
    [A release]; 
} 
関連する問題