Category Archives: Programming

[iPhone]高精度タイマーの使い方 NSTimeInterval


CoreGraphics(Quartz)の性能を評価するのに時間計測をしたかったのだが、1/1000秒のオーダーで時間計測はどうすればいいかわからなかったので調べたら、NSTimeIvervalクラスを使えばよいことがわかった。

測定を開始するタイミングで

NSDate *startTime = [NSDate date];

経過時間を求めるタイミングで

NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];
NSString* str = [NSString stringWithFormat:@"Elapsed time: %f", -elapsedTime];

NSTimeInterval型はdouble型と同じで、こんなかんじに浮動小数点で時間が求められる。

んで実際の速度測定の結果なんだけど
Quartzで10ピクセルの直線をランダムで色を変えながら100本描写した時の計測結果
img_00023

iPhone実機で0.1秒くらい。シミュレータだと0.01秒くらいだった。
全然違うっていうか、10倍。思ったよりiPhoneのCoreGraphicsの描写は速くないってのが感想。

以下その描写部分のソースコード

- (void)drawRect:(CGRect)rect {

	NSDate *startTime = [NSDate date];
	CGContextRef ctx = UIGraphicsGetCurrentContext();

	CGContextSetLineWidth(ctx,10.0);
	for(int i = 0; i< 100;i++){

		float fRed = (float)(rand()%100) / 100;
		float fGreen = (float)(rand()%100) / 100;
		float fBlue = (float)(rand()%100) / 100;
		float fAlfa = (float)(rand()%100) / 100;

		CGContextSetRGBStrokeColor(ctx, fRed,fGreen,fBlue, fAlfa);
		CGContextMoveToPoint(ctx,rand()%300,rand()%430);
		CGContextAddLineToPoint(ctx,rand()%300,rand()%430);
		CGContextStrokePath(ctx);
	}
	NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow];
	NSString* str = [NSString stringWithFormat:@"Elapsed time: %f", -elapsedTime];  

	UIFont *font = [UIFont systemFontOfSize:24];
	[str drawAtPoint:CGPointMake(0,0) withFont:font];
}

tAkatronixおすすめのiPhone開発本

iPhone デベロッパーズ クックブック
Erica Sadun
ソフトバンククリエイティブ
売り上げランキング: 84906
詳解 Objective-C 2.0
詳解 Objective-C 2.0
posted with amazlet at 10.01.31
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 4163
iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 3089
iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 22615

[iPhone]safariでURLを開く UIApplication

safariでURLを開くのはこのようにすればいい。
URLをmailto:にすればメールを送信できる

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://freeek.jp"]];

tAkatronixおすすめのiPhone開発本

iPhone デベロッパーズ クックブック
Erica Sadun
ソフトバンククリエイティブ
売り上げランキング: 84906
詳解 Objective-C 2.0
詳解 Objective-C 2.0
posted with amazlet at 10.01.31
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 4163
iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 3089
iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 22615

[iPhone]設定値を保存する NSUserDefaults

設定値などをロード、セーブするときはNSUserDefaultsクラスを使う。

設定画面のUISwichやUISliderの設定値を保存するコードは設定画面を閉じるタイミングで、このようにやったらうまくできた。
img_00071

//		設定画面を閉じるタイミング パラメータを保存
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults setBool:[swGravity isOn] forKey:@"gravity"];
[defaults setBool:[swRotation isOn] forKey:@"rotation"];
[defaults setBool:[swTouch isOn] forKey:@"touch"];
[defaults setFloat:[sldSensiblity value] forKey:@"sensibility"];

読み込むのはViewDidLoadでこんな感じにやった。

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[swGravity setOn:[defaults boolForKey:@"gravity"]];
[swRotation setOn:[defaults boolForKey:@"rotation"]];
[swTouch setOn:[defaults boolForKey:@"touch"]];
[sldSensiblity setValue:[defaults floatForKey:@"sensibility"]];

どこにどのように保存されるか気になったので調べると

シミュレータ上だと
/Users/ユーザ名/Library/ApplicationSupport/iPhoneSimulator/User/Applications/アプリのGUID/Library/Preferences/com.yourcompany.アプリ識別子.plist

iPhone上だと
/Applications/アプリのGUID/Library/Preferences/com.yourcompany.アプリ識別子.plist

e38394e382afe38381e383a3-12

このようにplist形式で保存される。

tAkatronixおすすめのiPhone開発本

iPhone デベロッパーズ クックブック
Erica Sadun
ソフトバンククリエイティブ
売り上げランキング: 84906
詳解 Objective-C 2.0
詳解 Objective-C 2.0
posted with amazlet at 10.01.31
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 4163
iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 3089
iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 22615

[iPhone]AVFoundationを使ったmp3再生


iPhoneでの音声の再生方法にはいろいろあって一番メジャーなのは
AudioQueueを使用する方法らしいのだが、
これみると結構大変。

調べるとiPhone 2.2からAVFoundationを使ってもっと簡単に再生できることがわかったのでやってみたので手順を記す。

 

フレームワークにAVFoundationを追加する。

Frameworksを右クリックして「追加」->「既存のフレームワーク」を選択

e38394e382afe38381e383a3-1

デフォルトだと、AVFoundation.frameworkのある場所は2.0のフレームワーク場所を指していて見つからないから、
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulatior2.2sdk/System/Library/Frameworks

から選択すること。(ここに嵌ったw)

コントローラのヘッダにを追加

#import <AVFoundation/AVFoundation.h>

コントローラオブジェクトへオブジェクトを追加

AVAudioPlayer*    m_sound;

初期化
リソースからfreeek.mp3ファイルをロードする場合のサンプル
あらかじめ、リソースにmp3ファイルを追加しておくこと。

NSString* a_file_path = [[NSBundle mainBundle] pathForResource:@"freeek" ofType:@"mp3"];
NSURL* a_file_url = [NSURL fileURLWithPath:a_file_path];
if( a_file_url ){
NSError* a_error = nil;
m_sound = [[AVAudioPlayer alloc] initWithContentsOfURL:a_file_url error:&amp;amp;amp;amp;amp;amp;a_error];
}

再生したい場所でplayメッセージを送る。非同期で再生される。

[m_sound play]

tAkatronixおすすめのiPhone開発本

iPhone デベロッパーズ クックブック
Erica Sadun
ソフトバンククリエイティブ
売り上げランキング: 84906
詳解 Objective-C 2.0
詳解 Objective-C 2.0
posted with amazlet at 10.01.31
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 4163
iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 3089
iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 22615

[iPhone]タイマー処理 NSTimerの使い方


iPhoneでタイマー処理の書き方

初期化処理

この例だと1/100秒毎にくりかす

NSTimer* timer;
timer = [NSTimer scheduledTimerWithTimeInterval:0.01				//	発生間隔(秒)
target:self				//	送信先オブジェクト
selector:@selector(onTimer:)	//	コールバック関数
userInfo:nil					//	パラメータ
repeats:YES];				//	繰り返し

コールバック関数のハンドラ

-(void)onTimer:(NSTimer*)timer
{
NSLog(@"onTimer\n");
}

tAkatronixおすすめのiPhone開発本

iPhone デベロッパーズ クックブック
Erica Sadun
ソフトバンククリエイティブ
売り上げランキング: 84906
詳解 Objective-C 2.0
詳解 Objective-C 2.0
posted with amazlet at 10.01.31
荻原 剛志
ソフトバンククリエイティブ
売り上げランキング: 4163
iPhoneプログラミングUIKit詳解リファレンス
所 友太
リックテレコム
売り上げランキング: 3089
iPhone Core Audioプログラミング
永野 哲久
ソフトバンククリエイティブ
売り上げランキング: 22615