0

このコードを使用していくつかのオブジェクトを作成し、それらを配列に格納しています

for (int iy=0; iy<5; iy++) {
        for (int ix=0; ix<5; ix++) {

            TerrainHex *myObject = [[TerrainHex alloc] initWithName:(@"grassHex instance 10000") width:mGameWidth height:mGameHeight indexX:ix indexY:iy];
            myObject.myImage.y += 100;

            [TerrainHexArray addObject:myObject];

            [self addChild:(id)myObject.myImage];
        }
    }
    NSLog(@"%lu", sizeof(TerrainHexArray));

いくつかの質問。

  1. ログには 4 しか表示されていませんが、これは意味がありません。5x5、つまり 25 であるべきではありませんか?
  2. そこに 25 個の個別のオブジェクト ポインターを作成していますか、それとも同じものを何度も再利用していますか? 25 個のポインターすべてを配列に保存しようとしています。
  3. ARC を使用していますが、ARC で何かをリリースする必要はありますか?
4

2 に答える 2

2

ログには 4 しか表示されていませんが、これは意味がありません。5x5、つまり 20 であるべきではありませんか?

[TerrainHexArray count]配列内のオブジェクトの量を取得するために使用します。sizeof(TerrainHexArray)のサイズを示しますid *。これは、システムでは 4 バイトです。

そこに 20 個の個別のオブジェクト ポインターを作成していますか、それとも同じものを何度も再利用していますか? 20個のポインターすべてを配列に保存しようとしています。

25 個のオブジェクトを作成しています

ARC を使用していますが、ARC で何かをリリースする必要はありますか?

いいえ。

于 2012-07-09T19:02:16.257 に答える
2
  1. sizeof()TerrainHexArray(おそらく) NSMutableArray へのポインターである変数のサイズをバイト単位で示します。32 ビット システムを想定すると、ポインターは 32 ビット、つまり 4 バイトです。[TerrainHexArray count]代わりに使用する必要があります。これは、配列内のオブジェクトの数を返すメソッドです。

  2. 同じものを何度も作成するのではなく、25 個のオブジェクト インスタンスを作成しています。myObject特定のオブジェクトへのポインターを保持する単なる変数です。割り当てによってそれを変更しても、以前に指していたオブジェクトは消去されません (ただし、ARC はそれを解放します)。

  3. いいえ、ARC がメモリ管理を行います。

1 つの小技: が NSArray のインスタンスであると仮定するTerrainHexArrayと、最初の文字を大文字にするべきではありません。これは言語の要件ではありませんが、クラス名を大文字にするのが慣例ですが、変数名には小文字の最初の文字を使用します。terrainHexArrayより適切で、コードをより読みやすくします。

于 2012-07-09T19:05:22.453 に答える