0

nsmutablearray にトランプのデッキを設定しようとしています。カード オブジェクトにはスーツとランクがあります。コードは次のとおりです。

-(void)loadCardNumbers {
    if(numDecks > 0)
    {
        //for each deck
        for(int i = 1; i<= numDecks; i++)
        {
            //for each suit
            for(int j = 1; j <= 4; j++)
            {
                //for each card 1-ace
                for(int k = 1; k <= 13; k++)
                {
                    //create card and add to shoe
                    Card *c = [[Card alloc]initWithSuit:j AndRank:k];

                    NSLog(@"%@", c);
                    [cards addObject:c];
                }
            }
        }
    }

そしてカードクラス:

@implementation Card

//return ace of spades, arbitrary card.
-(id)init
{
    return [self initWithSuit:DIAMONDS AndRank:ACE];
}
-(id)initWithSuit:(int)s AndRank:(int)r
{
    self = [super init];
    if(self)
    {
        suit = s;
        rank = r;
    }
    return self;
}

-(int)suit
{
    return suit;
}

-(int)rank
{
    return rank;
}

-(NSString *) description
{
    return [NSString stringWithFormat:@"CARD WITH SUIT %d AND RANK %d", suit, rank];
}
@end

何らかの理由で、NSLog はメソッド内で正しいように見えます (スーツの場合は 1...4、ランクの場合は 1...13 が正しく出力されます)。ただし、メソッドの完了後に配列で説明を呼び出​​すと、すべてのオブジェクトが「スーツ 4 ランク 13」と出力されます。これは、追加した最後のオブジェクトをすべて指していることを意味します。これを修正する方法についてのアイデアはありますか?

編集: arkku が指摘したように、私の ivar はクラス変数として宣言されました。Card.h で ivar を中括弧で囲むのを忘れていました

4

1 に答える 1

0

元の Card.h 実装:

int suit;
int rank;
@interface Card : NSObject    

-(id)init;
...

arkku のアドバイスによる正しい実装:

@interface Card : NSObject
{

int suit;
int rank;
}
-(id)init;
...
于 2013-03-26T02:34:48.373 に答える