0

次のように作成された200NSMutableArray個の弾丸 (のサブクラス) を含みます。CCSprite

capacity=200;
bullets = [[NSMutableArray alloc] initWithCapacity:capacity];

// Create a number of bullets up front and re-use them whenever necessary.
for (int i = 0; i < capacity; i++)
{
    Bullet* bullet = [Bullet bulletWithScreenRect:screenRect];
    bullet.visible = NO;
    bullet.bulletId=i;
    [bullets addObject:bullet];
    [self addChild:bullet]; 
}

それらを繰り返す for ループを作成し、ブレークポイントを追加して、アドレスが同じかどうかを確認しました。

for (int i = 0; i < capacity; i++)
{
    Bullet* bullet = [bullets objectAtIndex:i];
    CCLOG(@"%i %i", i, bullet.bulletId);
}

その結果、ポインタ「弾丸」は、200 個の弾丸すべてについて常にメモリ内の同じアドレスを参照します (0x1336c8a0)。弾丸 (int:bulletId) にプロパティを追加して、それらが異なるオブジェクトであるかどうかを識別しようとしましたが、そうです。ポインターが常に同じアドレスを指す理由がわかりません (同じアドレスを参照していますか?それとも単なるポインター メモリ アドレスですか?)。

Bullet*ポインターから 0x1336c8a0 アドレスを取得する場所は次のとおりです。

<code>Bullet*</code> ポインターから 0x1336c8a0 アドレスを取得する場所は次のとおりです。

4

2 に答える 2

0

Bullet クラスの bulletWithScreenRect メソッドを調べます。これはファクトリ メソッドだと思いますが、同じ静的オブジェクトを返すだけかもしれません。Bullet オブジェクトを自分で割り当てて初期化することもできます。その後、画面の四角形を個別に設定する方法があると思います。

つまり、次のように変更します。

  Bullet* bullet = [Bullet bulletWithScreenRect:screenRect];

このようなものに:

  Bullet* bullet = [[Bullet alloc] init];
  bullet.screenRect = screenRect;  // Not sure if this setter is present.

少なくとも、健全性チェックのためだけに、Bullet クラスのコンストラクターを変更して、個別のインスタンスを確実に作成することができます。先ほど言ったように、 bulletWithScreenRect メソッドの内容をチェックして、実際に何をしているのかを確認してください。それが私には犯人のように思えます。

于 2013-01-02T22:26:25.680 に答える
0

Bulletこれは、配列内に のインスタンスが 1 つしかないことを意味します。その場合、問題は間違いなくbulletWithScreenRectメソッドにあり、新しいインスタンスではなくキャッシュされたインスタンスを返します。

デバッガーに表示されているアドレスは、ポインターのアドレスではなく、ポインターが指しているアドレスであり、多かれ少なかれ役に立たないでしょう。ポインターが指しているアドレスは常に同じなので、同じオブジェクトについて話していることは明らかです。

今言ったことをテストするには、アドレスを出力して、デバッガーで取得した値と比較できます。

NSLog(@"Pointer own address: %p", &bullet);
NSLog(@"Address to where the pointer is pointing: %p", bullet); //this is what you should get in the debugger
于 2013-01-02T22:36:44.940 に答える