0

みんな。私の「engrish」はあまり良くありませんが、私の問題を理解していただければ幸いです。

私がこのようなコードを持っているとしましょう

-(id) init
{
    if ( self = [super init] )
    {
        deck = [[NSMutableArray alloc] initWithCapacity:52];
        Card *newCard = [[Card alloc] init];

        for ( int suit = 0; suit < 4; suit++ )
            for ( int rank = 0; rank < 13; rank++ )
            {
                newCard.suit = suit;
                newCard.rank = rank;
                [deck addObject:newCard];
            }
        [newCard release];
    }
    return self;
}

前述のコードに間違いがあるように感じます。ネストされたループに52の異なるオブジェクトを作成し、すべてのオブジェクトを配列に追加したいと思います。しかし、私は52個の同じオブジェクトを持ち、配列には同じアドレスを指す52個のポインターがあると思いますよね?

このようにするとどうなりますか。

-(id) init
{
    if ( self = [super init] )
    {
        deck = [[NSMutableArray alloc] initWithCapacity:52];

        for ( int suit = 0; suit < 4; suit++ )
            for ( int rank = 0; rank < 13; rank++ )
            {
                Card *newCard = [[Card alloc] init]; // I guess every time newCard
                newCard.suit = suit;                 // created, it will point to 
                newCard.rank = rank;                 // another chunk of memory,
                [deck addObject:newCard];            // right?
                [newCard release] // Should I release newCard every time?
            }
    }
    return self;
}

では、どの方法で52種類のカードを作成できますか?ありがとうございました。さらに説明が必要な場合は、私に聞いてください。

4

1 に答える 1

0

最初の質問:2番目のコードスニプレットは、配列に追加する52個の個別のオブジェクトを生成します。最初のスニプレットは、すでに自分で提案したように、配列に追加するオブジェクトを1つだけ生成します。これは1つのオブジェクトであるため、配列のすべてのメンバーのみがとの同じ値を保持.suit.rankます。

Alsはすでに提案しましたが、オブジェクトをnslogすると、少なくともそれらのアドレスがメモリに表示されます。アドレスが同一の場合、それは同一のオブジェクトです。

2番目の質問:はい、ARCを使用しない限り、リリースする必要があります。addObject追加された各オブジェクトを自動的に保持し、配列から削除すると解放されます。したがって、後で配列からオブジェクトをフェッチし、それをさらに使用する場合は注意が必要です。その後、再度保持する必要がある場合があります。

-correct-コードの代わりに、次を使用してオブジェクトを自動解放できます。

        Card *newCard = [[[Card alloc] init] autorelease]; // I guess every time newCard
        newCard.suit = suit;                 // created, it will point to 
        newCard.rank = rank;                 // another chunk of memory,
        [deck addObject:newCard];            // right?
        //[newCard release]; // not required, autoreleased

(ただし、リリースステートメントの後にセミコロンがありません。)

于 2013-03-27T09:59:54.987 に答える