• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:iPhone開発について(変数))

iPhone開発でボタンのタップ時間を取得する方法

このQ&Aのポイント
  • iPhone開発でボタンのタップ時間を取得する方法について教えてください。
  • ボタンをアップしたときにEXC_BAD_ACCESSのエラーが発生してしまう問題についても解決方法を教えてください。
  • タップ時間の計測に関するサンプルソースやより効率的な方法があれば共有してください。

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

startTap = [NSDate date]; > startTap = [[NSDate alloc] init]; あるいは [[NSDate date] retain]; いまのままでは、「autorelease」状態にあるので、インスタンスstartTapは、いつ開放されてもおかしくありません。「EXC_BAD_ACCESSのエラー」というのは、開放されたあとで、アクセスしたというエラー。 ここらへんの詳しいことは、お手持ちのiPhoneアプリ開発の解説書で、「Retain Count」を索引で牽いてください。 なお、開放されないように変更すると、ぎゃくにいつまでたっても開放されないので、deallocメソッド内で、releaseを送るのを忘れずに。 - (void)dealloc { [startTap release]; [super dealloc]; } もうひとつの手法としては、NSDateをインスタンス変数にせずに、NSTimeInterval型の実数をインスタンス変数にすること。NSTimeInterval型の実体はdouble型です。なので、インスタンス変数というより、C言語のグローバル変数として扱われるので、スコープ間(この場合、@implementationから@endの間)開放されることはありません。 宣言部: NSTimeInterval tapDate; 実装部: (IBAction)tapBtn_down{ tapDate = [NSDate timeIntervalSinceReferenceDate]; } - (IBAction)tapBtn_up{ NSTimeInterval now = [NSDate timeIntervalSinceReferenceDate]; NSLog(@"%f", now - tapDate); }

RYO-88
質問者

お礼

harawo 様 本当に解りやすい解説ありがとうございました。 autoreleaseは、アップルも推奨していないというところも参考書で把握していたのですが、勉強中なのでと気軽に利用して嵌まっていたということですね。 本当にありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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]; }

  • iPhone開発について

    初歩的な質問ですが、お願い致します。 ボタンをタップで音が鳴り、再びタップで音を止めるという動きを AVAudioPlayerを利用し実装したいと考えておりますがストップが思い通りに動きません。 プレイは正常に動作しております。 xCode4 で xib を利用しております。 該当部分だけコードを以下に抜粋させていただきます。 hogeController.m - (IBAction)btn{ NSString *path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *oto = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; if (hogeFlg == NO){ hogeFlg = YES; [oto play]; }else{ hogeFlg = NO; [oto stop]; } } デバッグでは、2回目のタップで、[oto stop];は通過しております。 基本的なところが理解できていないためということはわかっているのですが、解決策がわかりません。 また、xib を利用しておりますので、起動時に、- (void)viewDidload を読み込むのかな? と思い、入れてみたのですが通っておりません。 本当は、ここでセットして、ボタンタップじでは、再生と停止の処理だけを入れたいのですが、そういうことは可能なのでしょうか。 どうぞ、よろしくお願い致します。

  • Objective-Cの参照カウンタの質問です。

    Objective-Cの参照カウンタの質問です。 最近iPadの開発を始めた初心者です。 よろしくお願いします。 <質問1> 以下のようなサンプルを動作せさました NSObject *obj = [[NSObject alloc] init]; NSLog( @"A cnt %d", obj.retainCount); [obj release]; NSLog( @"B cnt %d", obj.retainCount); NSLog( @"C cnt %d", obj.retainCount); 以下のようにデバッガコンソールには表示されます 2010-08-15 11:41:45.711 MemoryTest[2087:207] A cnt 1 2010-08-15 11:41:45.756 MemoryTest[2087:207] B cnt 1 プログラムはシグナルを受信しました:“EXC_BAD_ACCESS”。 NSLog( @"B cnt %d", obj.retainCount);を実行する前にreleaseしているので、 "B cnt 1"は表示されず、:“EXC_BAD_ACCESS”が表示されるべきと思うのですが、 なぜ、このようになるのでしょうか? <質問2> 以下のようなサンプルを動作せさました NSObject *obj = [[NSObject alloc] init]; NSLog( @"A cnt %d", obj.retainCount); [obj release]; obj = nil; NSLog( @"B cnt %d", obj.retainCount); NSLog( @"C cnt %d", obj.retainCount); 以下のようにデバッガコンソールには表示されます 2010-08-15 11:45:32.151 MemoryTest[2122:207] A cnt 1 2010-08-15 11:45:32.162 MemoryTest[2122:207] B cnt 0 2010-08-15 11:45:32.165 MemoryTest[2122:207] C cnt 0 NSLog( @"B cnt %d", obj.retainCount);を実行する前にreleaseしているので、 「B]と「C」は表示せず、:“EXC_BAD_ACCESS”が表示されるべきと思うのですが、 obj = nil;の実行だけで、なぜ、このようになるのでしょうか? obj = nilはポインタをクリアするだけで、releaseの実行と関係ないと考えています。 よろしくお願いします。

  • Objective-Cでのエラー

    よろしくお願いします。「Xcode5ではじめるObjective-Cプログラミング(大津真著)」という本を購入し、Objective-Cの勉強をはじめました。Objective-Cが初めてのプログラミング初心者です。 本に記載されたコードを入力しているのですが、下記でエラーが出て困っています。 何度も見なおしたのですが本との違いを見つけることができませんでした。 どこがおかしいのかお分かりの方がおられましたらどうか教えて下さい。 ●エラー more '%' conversions than data arguments が、下記の2箇所で出ます。(いずれも生年月日の前の@ に矢印がでています。) >NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), >NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), 実行すると Thread 1:EXC_BAD_ACCESS(code=EXC_1386_GPFLT) とでます。 ---------- // main.m #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Person *personA = [[Person alloc]init]; [personA setName:@"吉田一郎"]; NSDate *dateA = [NSDate dateWithString:@"1979-11-12 00:00:00 +0900"]; [personA setBirthday:dateA]; [personA setHeight:180.5]; NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personA name], [personA birthday], [personA height]; Person *personB = [[Person alloc]init]; [personB setName:@"山田太郎"]; NSDate *dateB = [NSDate dateWithString:@"1981-03-01 00:00:00 +0900"]; [personB setBirthday:dateB]; [personB setHeight:172.3]; NSLog(@"%@ 生年月日:%@, 身長:%.1fcm"), [personB name], [personB birthday], [personB height]; } return 0; } ---------- // Person.h #import <Foundation/Foundation.h> @interface Person : NSObject -(void)setName:(NSString *)name; -(NSString *)name; -(void)setBirthday:(NSDate *)birthday; -(NSDate *)birthday; -(double)height; -(void)setHeight:(double)newValue; @end ---------- // Person.m #import "Person.h" @implementation Person { NSString *_name; NSDate *_birthday; double _height; } -(void)setName:(NSString *)aName { _name = aName; } -(NSString *)name { return _name; } -(void)setBirthday:(NSDate *)aBirthday { _birthday = aBirthday; } -(NSDate *)birthday { return _birthday; } -(void)setHeight:(double)aHeight { _height = aHeight; } -(double)height { return _height; } @end

  • iPhoneアプリのプログラミングに関する質問です

    iOSでiPhoneアプリの開発をしています。 今までに5本のアプリをアップストアにアップしているのですが、プログラムに関してアマチュアなので、サンプルを参考にしながら、稚拙なプログラム(配列などは使っていません。)を作っています。 6本目として作ったアプリを動かしてみたところ、1回目は普通に動くのですが、シミュレーターの下にある□ボタンで終了させた後に、再度起動させて動かすと、UIImageを呼び出すところで、フリーズしたり落ちたりします。 アップルのサンプルコードやチュートリアルなども見ているのですが、残念ながら私の力では、それらのチュートリアルで今回の問題を解決することは出来ませんでした。 下にあるのが、コードの一部ですが、[hana setImage:hana1]; のところで、Thread 1:Program received signal: "EXC_BAD_ACCESS".というエラーが出ます。メモリへの二重のアクセスが原因なのかもしれないと考えて、メモリを解放するために @property (nonatomic, retain) UIImage * hana0; @property (nonatomic, retain) UIImage * hana1; と @synthesize hana0; @synthesize hana1; と [hana0 release]; [hana1 release]; を追加しましたが、効果はありませんでした。 自分自身で何が問題か分かっていないために説明が間違っている可能性もあるので、この質問だけで解決していただくことは難しいと思いますが、どのような方向で考えるとよいのかだけでも教えていただくと助かります。 よろしくお願いします。 hのファイルです。 @interface MondaiViewController : UIViewController { UIImage * hana0; UIImage * hana1; IBOutlet UIImageView *hana; } @property (nonatomic, retain) UIImage * hana0; @property (nonatomic, retain) UIImage * hana1; -(IBAction) kaisi:(id)sender; -(IBAction) marutuke:(id)sender; @end mファイルです。 @implementation MondaiViewController @synthesize hana0; @synthesize hana1; -(IBAction) marutuke:(id)sender{ if (jidai == 0 && syoukou == 0 && tugi == 0) { int miss = 0; int kai = [[kaitou text] intValue]; if (kai == 345) { [kaitou setTextColor:[UIColor blackColor]]; [hana setImage:hana1]; //Thread 1:Program received signal: "EXC_BAD_ACCESS". } else { [kaitou setTextColor:[UIColor redColor]]; [hana setImage:hana0]; tugi = tugi - 1; miss = 1; } } - (void)dealloc { [hana0 release]; [hana1 release]; [super dealloc]; }

  • iPhoneのアプリ開発についてお伺い致します。

    Xcodeの実装をお伺いしたいのですが,あるアプリ開発の本を参考にして、クイズアプリをつくりました。クイズの問題、選択肢のデータファイルはテキストファイルでResourceに作成します。問題文をテキストビューに、選択肢をボタンに記載し、選択肢のボタンを押す事で回答させるシステムです。正解のボタンをタップすると、ボタンの文字の先頭に○を、不正解だと×を表示するのですが、これに、不正解時に正解のボタンの先頭に★等の印をつける為のソースコードをご教示いただければ幸いです。因に、テキストファイルには、1行目;問題文、2行目;正解の選択肢、3~5行目;不正解の選択肢、となっております。 //選択肢のボタンがタップされたときの処理 - (IBAction)answer:(id)sender { //正解か不正解かを見せる間、タップできない様に、ボタンを無効表示に変更する。 self.answerButton1.enabled = NO; self.answerButton2.enabled = NO; self.answerButton3.enabled = NO; self.answerButton4.enabled = NO; //タップされたボタンのラベルを取得する NSString *str = [[sender titleLabel] text]; //出題された問題の情報を取得する QuizItem *item = [self.quiz.usedQuizItems lastObject]; //正解か判定する if ([item checkIsRightAnswer:str]) { //正解なので、○を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"○ %@", str] forState:UIControlStateNormal]; //効果音を再生する AudioServicesPlaySystemSound(_rightSound); } else { //不正解なので×を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"× %@", str] forState:UIControlStateNormal]; }

    • 締切済み
    • Mac
  • iPhoneのアプリ開発についてお伺い致します。

    Xcodeの実装をお伺いしたいのですが,あるアプリ開発の本を参考にして、クイズアプリをつくりました。クイズの問題、選択肢のデータファイルはテキストファイルでResourceに作成します。問題文をテキストビューに、選択肢をボタンに記載し、選択肢のボタンを押す事で回答させるシステムです。正解のボタンをタップすると、ボタンの文字の先頭に○を、不正解だと×を表示するのですが、これに、不正解時に正解のボタンの先頭に★等の印をつける為のソースコードをご教示いただければ幸いです。因に、テキストファイルには、1行目;問題文、2行目;正解の選択肢、3~5行目;不正解の選択肢、となっております。 //選択肢のボタンがタップされたときの処理 - (IBAction)answer:(id)sender { //正解か不正解かを見せる間、タップできない様に、ボタンを無効表示に変更する。 self.answerButton1.enabled = NO; self.answerButton2.enabled = NO; self.answerButton3.enabled = NO; self.answerButton4.enabled = NO; //タップされたボタンのラベルを取得する NSString *str = [[sender titleLabel] text]; //出題された問題の情報を取得する QuizItem *item = [self.quiz.usedQuizItems lastObject]; //正解か判定する if ([item checkIsRightAnswer:str]) { //正解なので、○を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"○ %@", str] forState:UIControlStateNormal]; //効果音を再生する AudioServicesPlaySystemSound(_rightSound); } else { //不正解なので×を先頭に追加する [sender setTitle:[NSString stringWithFormat:@"× %@", str] forState:UIControlStateNormal]; }

  • xcodeで配列を保存する方法を教えてください

    初めまして。 うん十年ぶりにプログラミングに取り組んでいる、ccode初心者です。 ボタンを押すと、その時点の日付を取得して配列として保存するアプリを作っております。 ですが、変数の設定が悪いのか、MutableArray変数(_kitaku)をインスタンス変数で宣言すると、UserDefaultsで読み込んだ際に、読み込んだデータを取り込むことが出来ず、 ローカル変数で宣言すると、取得した日付を配列として保持することが出来ません。 おそらく変数の宣言の仕方かと思いますが、 どなたか、解決策を教えていただければ幸いです。 ちなみに、現在作成中のコードは下記の通りとなります。 よろしくお願いいたします。 ----- #import "OWBViewController.h" @interface OWBViewController () { //配列宣言 NSMutableArray *_kitaku; } //帰宅時間を取得するボタン @property (weak, nonatomic) IBOutlet UIButton *GetTime; //帰宅時間を取得するメソッド - (IBAction)GetTime:(id)sender; //時刻を保存するメソッド - (void)saveTime; @end @implementation OWBViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 保存した時間を読み込む NSUserDefaults *Rireki = [NSUserDefaults standardUserDefaults]; NSMutableArray *_kitaku = [Rireki objectForKey:@"kitaku"]; // ブレークポイント NSLog(@"過去結果配列 %@",_kitaku); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void)saveTime { //保存 NSUserDefaults *Rireki = [NSUserDefaults standardUserDefaults]; [Rireki setObject:_kitaku forKey:@"kitaku"]; BOOL successful = [Rireki synchronize]; if (successful) { NSLog(@"%@", @"データの保存に成功しました。"); } } - (IBAction)GetTime:(id)sender { //NSMutableArray *_kitaku; NSDate *kitaku = [NSDate date]; if(!_kitaku){ _kitaku = [[NSMutableArray alloc] init]; } [_kitaku insertObject:kitaku atIndex:0]; NSLog(@"帰宅時間 %@", kitaku); NSLog(@"帰宅時間配列 %@", _kitaku); [self saveTime]; } @end

  • objective-Cについてご相談があります。

    objective-cを勉強しているのですが、 以下のメソッドの内容がいまいち分かりません。 どなたか解説して頂けないでしょうか・・・ ログを取ると、 「1:1   2:1」 、 「1:1  2:2」 といった感じで、2つ目の数値が、ボタンを押すたびに 増えていくのですが、この内容がどういった所に使われる のかが分かりません。 ------------------ここから--------------------------- // [変数]ボタン押下 - (IBAction)pushButton01:(id)sender { // 自動変数 auto int i01 = 0; // autoは普段省略されている i01++; // i01 = i01 + 1;と同義 NSLog(@"1:%d", i01); // 静的変数 static int i02 = 0;// どんどん増えていく i02++; NSLog(@"2:%d", i02); } --------------ここまで---------------------------- 以上、お手数ですが、何卒宜しくお願い致します。

  • @interface FirstViewController :UIV

    @interface FirstViewController :UIViewController { NSMutableString *Mixbox; } -(IBAction)testtime:(id)sender; m. - (void)viewDidLoad { [super viewDidLoad]; MixBox = [NSMutableString string]; [MixBox retain]; } (IBAction)testtime:(id)sender{ NSString *Time=@"1回目の時間\n "; NSDate *Date=[NSDate date];//時間の設定 NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; [formatter setDateFormat:@"yyyy:MM:dd::hh:mm:ss"]; NSString *Str = [formatter stringFromDate:Date]; [Mixbox appendString:Time]; [Mixbox appendString:str]; self.flowView.text=Mixbox; } //Mixboxに代入した文字を他のアクションで、文字をつなげるようにするにはどうしたらいいですか? <例> ボタンを押す→トリガーされtesttimeが実行させる 表示のイメージ 1回目の時間:000000 2回目、違うボタンを押す→違うアクションが同じようにトリガーされ実行する 表示のイメージ 1回目の時間:00000000//これは前回押したもの 2回目の時間:00000000//今おしたもの このようなイメージでしたいのですが、何度やっても、代入で代入されますから、前回押して代入された文字列は消えてしまいます。 どうしたら前回のが消えずに、他のアクションで代入されたやつをそのあとに代入するにはどうしたらいいでしょうか? 本当に困っているので助けて下さい。お願い致します。