• 締切済み

[objective-C]配列について

はじめまして。 objective-C、cocos2dについての質問です。 iPhoneアプリを勉強しながら作り始めたのですが詰まってしまい、できればご助力をお願いしたいと思い質問させていただきました。 cocos2dというフレームワークを使用し簡単なRPGを作りたいと考えております。 そこでキャラクターのステータスを配列に格納し、どのシーンからも参照したいのですが、どうしてもうまくいきません。 別クラスでインスタンス変数を作り、それを利用して配列を作成する方法で実装しようとしており、実際のコードは以下の通りになります。 ---------------------------------- <Character.h> @interface Character : NSObject{ NSInteger characterStateAtk_; ・(Def、Hpなど) ・ } @property (nonatomic, assign) NSInteger characterStateAtk;  ・  ・ @end <Character.m> #import "Character.h" @implementation Character @synthesize characterStateAtk = characterStateAtk_;  ・  ・ @end キャラクターステータス生成部分 <CreateScene.h> @interface CreateScene : CCScene { NSMutableArray* characterStateArray_; } @property (nonatomic, assign) NSMutableArray *characterStateArray; @end <CreateScene.m> @interface CreateScene() - (void) pressReloadButton:(id)sender; - (void) createCharacterState; @end @implementation CreateScene @synthesize characterStateArray = characterStateArray_; - (void) dealloc{ [self.characterStateArray release]; [super dealloc]; } - (void) createCharacterState{ self.characterStateArray = [NSMutableArray array]; Character* priState = [[[Character alloc]init] autorelease]; priState.characterStateAtk = random() % 5 + 5; ・ ・ [self.characterStateArray addObject:priState]; } (その他の処理) - (void) pressReloadButton:(id)sender{ [self createCharacterState];  (ここでcharacterStateArrayを取得して表示したい) } ---------------------------------- 最初は、 NSInteger x; x = [[self.characterStateArray objectAtIndex:0]intValue]; で取得しようとしたのですがエラーとなり実行できませんでした。 (調べていくうちにobjective-Cでは配列の中身はオブジェクトしか使えないという事を知りました) プログラム中の(ここでcharacterStateArrayを取得して表示したい)の部分について、実装方法や考え方についてご助言をいただけないでしょうか? よろしくお願いいたします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「エラーとなり実行できませんでした」ですが, 「どのようなエラーとなったのか」はわかりませんか?

takuma426
質問者

補足

説明足らずでした、申し訳ありません。 - (void) pressReloadButton:(id)sender  を割り当てたボタンを押した所、その他の処理(フレームレート表示など)もすべて止まり、シュミレーターが落ちてしまいます。 明確なエラーメッセージは無く、main.mの int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); がハイライトされており、メッセージは, Thread1 : Program received signal: "SIGABRT" となっております。 もしまだ説明不足な所があれば、ご指摘いただければ幸いです。 よろしくお願いします。

関連するQ&A

  • Objective-C,viewが動作しない

    IBを使わないカメラアプリを作っています。 AppDelegate.m内のapplication didFinishLaunchingメソッド内で生成したwindowとviewはコンパイルして表示確認できたのですが、viewControllerで書いたUIImagePickerViewControllerのviewが出てきません。 そもそもviewController.mのloadViewメソッドやviewDidLoadメソッドが動いていません。(メソッド内にNSLogを書いてコンパイルしてもログに出ない) viewController.h #import <UIKit/UIKit.h> @interface CameraViewController : UIViewController <UINavigationControllerDelegate,UIImagePickerControllerDelegate> { @private UIImagePickerController* _imagePicker; } @property(nonatomic,retain) UIImagePickerController *imagePicker; @end viewController.m #import "CameraViewController.h" @implementation CameraViewController @synthesize imagePicker=_imagePicker; - (void)dealloc { [super dealloc]; } #pragma mark - View lifecycle - (void)loadView { [super loadView]; //UIImagePickerControllerの作成 if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ return; } UIImagePickerController* imagePicker; imagePicker = [[UIImagePickerController alloc] init]; [imagePicker autorelease]; imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; imagePicker.allowsEditing=NO; imagePicker.delegate = self; //imagePickerのviewを最上部に [self presentModalViewController:imagePicker animated:YES]; //シャッターを切る [self.imagePicker takePicture]; } @end viewControllerが機能しない原因としてそういった可能性が考えられるのでしょうか? あれこれ調べてみましたが煮詰まっています。よろしくお願いします

  • Objective-Cのエラーコードの意味

    タイトルの通りです。 エラー部分は最下部にあります。 ------------------------------------------------------------------------------------------------- // // ViewController.m // Kadai // // Created by on 2014/08/10. // Copyright (c) 2014年 saikoro. All rights reserved. // #import "ViewController.h" @interface ViewController () <UIAlertViewDelegate> @property (weak, nonatomic) IBOutlet UITextField *tfMyouji; @property (weak, nonatomic) IBOutlet UITextField *tfName; @property (weak, nonatomic) IBOutlet UILabel *Aisatsu; @end @implementation ViewController // 画面タッチ時 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // キーボード非表示 [self.tfMyouji resignFirstResponder]; [self.tfName resignFirstResponder]; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } // [挨拶する]ボタン押下 - (IBAction)introduce:(id)sender { UIAlertView *av = [[UIAlertView alloc]initWithTitle:@"確認" message:@"挨拶しますか?" delegate:self cancelButtonTitle:@"キャンセル" otherButtonTitles:@"はい", nil]; // 表示 [av show]; } // AlertViewボタン押下 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"再確認" message:@"本当に挨拶しますか?" delegate:nil cancelButtonTitle:@"やっぱりやめときます" otherButtonTitles:@"早く!", nil]; [av show]; } // AlertViewボタンさらに押下 + (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ // 入力された名前の保持 NSString *str = self.tfMyouji.text; ←ここでエラーが出ます。なぜか「tfMyouji」が                    予測で出てきません } @end ------------------------------------------------------------------------------------------------- どなたかエラーの理由をご教授頂けないでしょうか。 以上、何卒宜しくお願い致します。

  • iPhone SDK・Xcode・Objective-cでのプロジェク

    iPhone SDK・Xcode・Objective-cでのプロジェクト共通定数クラスの定義について はじめて質問させていただきます。内容に不足あればすぐ修正しますのでご指摘ください。 当方iPhone SDK・Xcode・Objective-cを利用してアプリ開発をしています。 経験はCが我流で10年ほど、仕事ではjavaをメインに使っております。 それでアプリケーション全体から参照する定数を定義したいのですが使い勝手がいまひとつでして皆さんにご教示願いたい次第です。 javaではAppConst.javaというクラスファイルを作ってpublic const int NUMBER_ROW = 1と書き、 あとは使う側でその定数クラスをインクルードしておけば、AppConst.NUMBER_ROWという風に呼び出せたかと思います。(社内のフレームワークのおかげかもしれませんが…) Objective-cでも同様にしようと以下のように定数クラス AppConstを作りました。 #import <Foundation/Foundation.h> @interface AppConst : NSObject { NSInteger NUMBEROFFONT; } @property (nonatomic, assign) NSInteger NUMBEROFFONT; -------- #import "AppConst.h" @implementation AppConst @synthesize NUMBEROFFONT; -(id) init { self = [super init]; if (self != nil) { NUMBEROFFONT = 5; } return (self); } @end しかしこのクラスですと、参照側でインクルードするだけではなく、定数クラスのインスタンスを作らないと定数にアクセスできません。 #import "AppConst.h" (NSInteger) testMethod { AppConst *appConst = [[[AppConst alloc] init] autorelease]; return appConst.NUMBEROFFONT; } 使う度にインスタンスを作るのは面倒ですしメモリとしてもよくないように感じます。 もっと賢いやりかたがあればよろしくご教示のほどお願いします。

  • Objective-C,NSTimerを使って1秒毎に10秒かかる処理

    Objective-C,NSTimerを使って1秒毎に10秒かかる処理を実行させる事ってできますか? 例えば、以下に書いたとすると、(行頭全角スペースです。) @interface testTimer : NSObject {  NSTimer *timer; } @end @implementation testTimer - (id) init { timer = [NSTimer scheduledTimerWithTimeInterval:1.0  target: self  selector:@selector(timeUpdate:)  userInfo:nil  repeats:YES]; } - (void) timeUpdate:(id)sender {  NSLog(@"%@",[NSDate date]);   [NSThread sleepUntilDate:[[NSDate date] addTimeInterval:10.0]]; } @end 毎秒タイムスタンプは出力されませんでした。 以上、ご指導の程、よろしくお願いいたします。

  • Objective-c の変数の参照取得方法について

    メンバ変数とかの参照(アドレス)を取得するにはどうすれば良いのでしょうか? 下記のようなサンプルを書いてもコンパイルエラーになってしまいます。Objective-C ってCと記述が同じだと思っているので「&」演算子でアドレスが取れると思っていたのですが。。。 @interface AAA : NSView { } -(void) test:(NSRect *)rct; @end @implementation AAA -(void) test:(NSRect *)rct { NSRect *p = nil; if (nil == rct) p = &[self frame]; <- フレームのアドレスを取得したい else p = rct; } @end 以上 宜しくお願い致します。

  • Obj-Cで生成元のViewへ文字列を表示させたい

    iOS SDK(Objective-C)を勉強中なのですが、あるView(TestViewController.view)から別のView(ButtonViewController.view)を表示し、表示したViewにあるボタンを押した時に、生成元のView(TestViewController.view)のラベル(test_label)に文字列を表示したいのですが、色々やってみたものの上手く行かず、どの用に実装するのが正しいのか行き詰まってしまいました。どなたか手助けよろしくお願いします。 //*** TestViewController.h #import <UIKit/UIKit.h> #import "ButtonViewController.h" @interface TestViewController : UIViewController { IBOutlet UILabel *test_label; ButtonViewController *buttonViewController; } - (IBAction) pushButton:(id)sender; @end //*** TestViewController.m #import "TestViewController.h" @implementation TestViewController - (void)viewDidLoad { [super viewDidLoad]; test_label.text = @"Push Button"; } //ButtonViewを表示 - (IBAction) pushButton:(id)sender { buttonViewController = [[ButtonViewController alloc] initWithNibName:@"ButtonView" bundle:nil]; [self.view addSubview:buttonViewController.view]; } - (void)dealloc { [buttonViewController release]; [super dealloc]; } @end //*** ButtonViewController.h #import <UIKit/UIKit.h> @interface ButtonViewController : UIViewController { } - (IBAction) pushButtonSub:(id)sender; @end //*** ButtonViewController.m #import "ButtonViewController.h" @implementation ButtonViewController - (void)viewDidLoad { [super viewDidLoad]; } - (IBAction) pushButtonSub:(id)sender { // ??? ← このボタンを押したときにtest_labelへ表示させたい } - (void)dealloc { [super dealloc]; } @end

  • IBAction内でのEXC_BAD_ACCES

    iPhone開発関係で質問です。 IBAction内でNSMutableDictionaryを参照しようとするとEXC_BAD_ACCESSとなってしまい、困っています。メモリ管理が甘いのでしょうか?? プログラムの概要は以下のとおりです。 問題をご存知の方、ご教授下さい。よろしくお願いします。 ---------- FirstViewController.h @interface FirstViewController : UIViewController { NSMutableDictionary *testDic; } @property (nonatomic , retain) NSMutableDictionary *testDic; - (IBAction) TestBtnTapped; @end ---------- FirstViewController.m #import "FirstViewController.h" @implementation FirstViewController @synthesize testDic; /* testDicの受け渡しがうまくいかない TestBtnTappedでEXC_BAD_ACCESS発生 IBActionのせい? */ - (IBAction) TestBtnTapped{ NSlog(@"%@" , testDic); } - (void)viewDidLoad { [super viewDidLoad]; testDic = あるNSMutableDictionaryデータ NSlog(@"%@" , testDic ); //ここでは表示される } - (void)dealloc { [super dealloc]; }

  • 【Objective-C】プロパテイについて

    Objectiv-Cの勉強を始めたばかりの者です。 プロパテイの機能を理解する為に以下のようなプログラムを書きました。 例1)まずは、プロパテイを使わない例です。 ーーーーーーー data.h ーーーーーーー #import <Foundation/NSObject.h> #import <Foundation/NSString.h> @interface Data : NSObject { NSString* str; } - (void)setStr:(NSString* )arg; - (NSString*)retStr; @end ーーーーーーー data.m ーーーーーーー #import "Data.h" @implementation Data - (NSString*) retStr{ return str; } - (void)setStr:(NSString*) arg{ [arg retain]; [str release]; str = arg; } @end ーーーーーーー main.m ーーーーーーー #import <stdio.h> #import "Data.h" int main(void) { Data* data = [[Data alloc] init]; [data setStr:@"aaa"]; NSLog(@"%@",[data retStr]); return 0; } 例2)次に、プロパテイを使って例1を書き換えてみました。 ーーーーーーー data.h ーーーーーーー #import <Foundation/NSObject.h> #import <Foundation/NSString.h> @interface Data : NSObject { NSString* str; } @property (retain) NSString* str; @end ーーーーーーー data.m ーーーーーーー #import "Data.h" @implementation Data @synthesize str; @end ーーーーーーー main.m ーーーーーーー #import <stdio.h> #import "Data.h" int main(void) { Data* test = [[Data alloc] init]; test.str = @"hoge"; NSLog(@"%@",test.str); return 0; } 例2を実行した結果、以下のように出力されました。 2010-02-05 22:17:50.696 data[1583:903] *** __NSAutoreleaseNoPool(): Object 0x100001068 of class NSCFString autoreleased with no pool in place - just leaking 2010-02-05 22:17:50.698 data[1583:903] hoge @propertyのオプションを(retain) ではなく、(assign)に変更すると、 2010-02-05 22:30:02.271 data[1619:903] hoge と出力されて、期待した結果が得られるのですが、なぜretainではダメなのでしょう? また、assignでも例1のようなメモリ管理は自動的に行われているのでしょうか? 以上、ご指導の程、よろしくお願いいたします。

  • Objective-C グローバル変数 値変更反映

    当方、Objective-Cに関して1年にも満たない経験を持つ初心者です。 初歩的な内容だとは思いますが行き詰まってしまったため質問させて下さい。 複数の.hと.mファイルで定義された複数クラス間で一つの変数を共通で利用し、あるクラスのメソッド内で値を変更した際にそれ以外のクラスですぐに反映出来る様にしたいのですが、どの様に書いても値が反映されず初期値のまま出力されてしまいます。恐らく各クラス内のメソッドが呼ばれる順番に起因すると思うのですが、上手く解決出来ません。 現在書いているコードとして、 -xxxAppDelegate.h (at)interface xxxAppDelegate : NSObject <UIApplicationDelegate> { ... int globalNum; } (at)property(nonatomic, assign)int globalNum; (at)end -xxxAppDelegate.m ... (at)implementation xxxAppDelegate (at)synthesize globalNum; ... (at)end -A.h ... (at)interface AController : UIViewController { xxxAppDelegate *appDelegate; } ... -(void)changeNum; -(IBAction)changeController; (at)end -A.m ... (at)implementation AController ... - init(){ appDelegate = (xxxAppDelegate *)[[UIApplication sharedApplication] delegate]; } ... -(void)changeNum{ //ここでglobalNumの値を変更; appDelegate.globalNum=...; } ... //配置したボタンを押すとA->BにviewControllerを切り替える -(IBAction)changeController{ BController *B = [[BController alloc] initWithNibName:(at)"BController" bundle:nil]; B.modalTransitionStyle = UIModalTransitionStyleCoverVertical; [self presentModalViewController:B animated:YES]; [B release]; } ... (at)end -B.h ... (at)interface BController : UIViewController { xxxAppDelegate *appDelegate; } ... -(void)readNum; (at)end -B.m ... (at)implementation BController ... - init(){ appDelegate = (xxxAppDelegate *)[[UIApplication sharedApplication] delegate]; } ... -(void)readNum{ //globalNumの値を見る; NSLog((at)"%d" , appDelegate.globalNum); } ... (at)end となっています。( (at)=アットマークです。 ) xxxAppDelegateおよびxxxViewControllerよりAControllerを呼び出し、AクラスのchangeNumメソッドでglobalNumの値を変更した後、ボタンを押下してviewControllerをBControllerに切り替え、Bクラス内のreadNumメソッドでglobalNumの値を確認すると、変更が反映されていない事が分かります。 この方法以外にも色々と試してみたのですが、すっきりとしたコードが書けず、解決に至りませんでした。 申し訳ありませんが、皆さんの知恵をお貸し下さい。 よろしくお願いします。

  • Objective-C初心者です。コンパイルができません。

    Objective-C初心者です。コンパイルができません。 4月からC言語でプログラミングを学び始め、昨日からObjective-Cに手を出しました。 Mac OS X 10.6.4を使用中です。入門書に書いてあったコードをそのまま入力し、ターミナルからgccによるコンパイルを行ったところエラーがでます。 どなたか原因が分かる方、アドバイスをお願いします。 以下具体的なコードです。←で指した行(2箇所)にエラーメッセージが出ています。 Objectを定義した正しいインクルードファイルがない、などが原因かなと考え調べて見たのですがどうもobjc/Object.hで問題なさそうなので打つ手がなく困っています。 #import <stdio.h> #import <objc/Object.h> @interface Test : Object ←error: cannot find interface declaration for 'Object', superclass of 'Test - (void) method ; @end @implementation Test - (void) method  { printf("Kitty on your lap\n") ; } @end int main() { id obj = [Test alloc] ;   ←warning: 'Test' may not respond to '+alloc' [obj method]; return 0; }

専門家に質問してみよう