ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Xcode/InterfaceBuilderコミュの初心者の質問です

  • mixiチェック
  • このエントリーをはてなブックマークに追加
Xcodeによるプログラミングの質問 最近、XcodeをインストールしてiPhoneのアプリを作成する勉強をはじめました。

現在、下のサイトの解説をよんでじゃんけんアプリを作成しました。
http://d.hatena.ne.jp/moto_maka/20110404/1301859273

これをもとに、画面にじゃんけんをする度に勝ち負け引分の数値を表示させたいのですが、変数の使い方がわかりません。

はじめ、Supporting Filesの中のmain.mで変数を指定すれば、ViewController.mで使用できると思ったのですが違ったみたいで...

次に、ViewController.hの中で変数を指定して、それを任意のLabelに代入することで表示することはできたのですが、変数の中身を増やしたり減らしたりすることができませんでした。
例)score++; score = score -1;

ソースコードを貼らないとわからないかもしれないですが、やり方を教えていただけると助かります。

また、変数の使い方がわかるサイトを知っている方がいたら、教えていただけると幸いです。

コメント(6)

んん?

そこまでわかっていれば、できそうなもんですが。

数値が表示されているのにそれが変わらない、ってことかな?

じゃんけんするたびに、書き換えていますか?
>>[1] コメントありがとうございます♪

ViewController.mの中のViewDidLoad内で

int winscore = 0;
winlbl.text = [NSString stringWithFormat:@"%d", winscore];

と、記述することで、最初の0勝の部分は表示できるのですが、そこから勝つたびに数字を増やすための記述の仕方がわかりません…。

じゃんけんをする度に書き換えるとはどういう意味でしょうか?教えていただけると助かります!
>>[2]

int winscore = 0; とViewDidLoadの中で宣言しても、winscoreが有効なのはViewDidLoad内だけです。
まず、この部分がまずいです。ViewControllerクラス全体で有効にさせたいのでしょうから、そのヘッダファイルの中で宣言するのが普通です。

(この件については、「関数のスコープ」などと検索して調べみてください)

winlbl.text = [NSString stringWithFormat:@"%d", winscore];
は、winscoreの値を常時winlble.textに表示させる、という命令ではないです。この命令が実行されるのは文字通りviewがloadされる時の一度だけで、その時にwinscoreの値(たぶん0ですね)がwintblラベルに表示されるだけで、後に変化するわけではないです。

なので、じゃんけんの勝ち数が変化するたびに、
winscoreの値を変化させて、(winscore++とか)
winlbl.text = 
の命令を書いてやる必要があります。具体的には、勝ちが決定して、「あなたの勝ちです」って表示する命令の前後に書けば良いのでは?

これでわかるでしょうか?


>>[3]
返信のお礼が遅れてしまい申し訳ありませんでした。

無事に問題を解決することができました。ありがとうございます。

現在、ポーカーのアプリを作っているのですが、配列を使用して

NSArray *card = [NSArray arrayWithObjects:@"h1",@"h2"....@"c13",nil];

上記のように、ハート、スペード、ダイヤ、クローバーの計52枚分の配列を用意して

NSString *mycard11 = [card objectAtIndex: arc4random() % 52];
mycard1.text = [NSString stringWithFormat:@"%@",mycard11];

上記のようにランダムに52枚の中から1枚選ぶのを5個作り、それを表示するようにしたのですが

RunをするとエラーはでずSucceededとでるのですが、真っ黒の画面がでてすぐに終了し

EXC_BAD_ACCESS

上記のエラーが表示されました。

絵柄をハートのみにし、52枚から13枚にかえると、エラーもでずシュミレーター上にランダムに5枚表示されます。

自分で調べたところメモリ管理がうまくいっていない?ようなのですが、具体的にどのようにすればいいかわかりません。

もしよろしければ、こちらの質問にも答えていただけると幸いです。
うーん、これだけだとなんとも言えませんね。

配列は生成のしかたによっては、予期せず開放されることもあります。52ならダメで13ならOKというのはその可能性が高いような。ガベージコレクションをオン・オフの場合でも、挙動が違ったりしてくると思いますので、その部分から調べてみた方がよさそうです。

所々で、NSLogで配列にアクセスしてみて、どこまで配列が有効なのかを探ってみるのが良いのかも。

まあ、これは配列に原因があると仮定した場合ですが、もちろん違う可能性もあります。

--------------------

ところで、ここで冷静に考えてみると、配列はメモリを圧迫するんですから、配列自体を作らない方向が良いでしょう。

そこで、
NSArray *card
を作らない、という方法を考えましょう。

例えば、乱数を2つ用意して、一つ目の乱数で0〜3の4通りでハートとかクローバーのマークを、2つ目の乱数で0〜12の13通りの目の数を生成させれば、そもそも配列なんぞ必要としません。

この作戦で試してみてはどうでしょう?

> NSArray *card = [NSArray arrayWithObjects:@"h1",@"h2"....@"c13",nil];



> NSString *mycard11 = [card objectAtIndex: arc4random() % 52];
> mycard1.text = [NSString stringWithFormat:@"%@",mycard11];

は同一スコープ≒同一メソッド内での記述でしょうか?
それなら問題はありませんが、それぞれ別の場所で記述されていたら問題があります。
arrayWith系のメソッドはautoreleaseされているので、retainしない限り消えてしまいます。
retainするかallocしてinitWithObjectsで生成し、不要になったらreleaseして下さい。

蛇足ですが、NSArrayに限らずalloc-initせずにクラスのインスタンスを生成するメソッドは全て同様の挙動になります。例えばNSStringで言えばstringWith系のメソッドなどです。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Xcode/InterfaceBuilder 更新情報

Xcode/InterfaceBuilderのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。