0

私は Java および C++ 開発の経験が豊富であるため、クラスとデータの抽象化は私にとって非常に簡単です。私は少し前にオブジェクティブ C を始めたばかりで、ほとんどがクラス内のグローバルで作業しており、すべてが順調に進んでいました。スパゲッティコードを少なくするために、コードの大部分を抽象化することにしましたが、土曜日以来克服できなかった問題にぶつかりました。

概要:

トランプゲームを作っています。最近、カード データを 3 つの変数を含むクラスに抽象化しました。(int)i_cardValue、(int)i_cardSuit、および (UIImage *)uii_cardImage。呼び出してカードを作成します

-(PlayingCard *)initWithValue:(int)i_initValue suit:(int)i_initSuit image:(UIIMage*)uii_initImage {

     [self setCardValue:i_initValue];

     [self setCardSuit:i_initSuit];

     [self setCardImage:i_initImage];

     return self;

}

また、エンジン部分 (基本的にシャッフルやデッキ管理などのデッキ機能) も抽象化しました。デッキは変更可能な配列であり、デッキの初期化関数があります。

NSMutableArray *nsma_deck;
-(void)initDeck {
     nsma_deck = [[NSMutableArray alloc] initWithCapacity:52];
}

ここで、ビュー コントローラーで initDeck を呼び出し、次のような行で項目をデッキに追加します。

[pce_Engine initDeck];
[[pce_Engine nsma_deck] addObject:[[PlayingCard alloc] initWithValue:13 suit:2 image:[UIImage imageNamed:@"2C.png"]]];

pce_Engine は PlayingCardEngine 型の変数です。NSLog 行を initDeck に入れましたが、プログラムを実行してもコンソールに表示されません。それらが呼び出されていないため、配列が割り当てられていないため、配列に要素を追加できませんか? 私はこれで問題ないと思っていましたが、ビューに追加しても表示されないため、間違っているか、何かが欠けています。NSLogを使用すると、デッキ== nilなので、問題はデッキに正しくアクセスしていないため、値を追加せず、どこにでも空の変数しかないことだと思います:(。目的cのチュートリアルをたくさん見てみました。しかし、私が行っている限り抽象化するものさえ見つけていないので、私の問題を見つけることができませんでした。

誰かが私を正しい方向に向けることができますか?

4

2 に答える 2

3

あなたのカード クラスは のサブクラスであると推測しNSObjectます。initWith... メソッドでは、呼び出してから割り当てを行う必要があります。init[super init][self init]

ここに cocoa/objective-c 初期化子に関する良い記事があります: http://mikeash.com/?page=pyblog/the-how-and-why-of-cocoa-initializers.html

デッキ管理のクラスも同様です。これが問題を見つけるのに役立つことを願っています。

于 2009-11-24T12:46:01.660 に答える
0

まず第一に、私はEimantasに同意します。あなたのinitメソッドには[super init]への呼び出しがありません(その値を返す必要があります。通常のinitメソッドがどのように見えるかを読んでください)。

しかし、init_deckに関しては、View Controllerのどのメソッドにこれらの2行がありますか?呼び出し元のコードが他の何よりもどこにあるかに基づいて呼び出されているのではないと思います(ただし、そのコードが呼び出されたときにpce_Engineもnilになる可能性があり、その場合はまったく機能しません)。

于 2009-11-24T20:03:31.743 に答える