投稿

const char *argv[]

iOSプログラミングでmain関数ってあまりじっくり見る機会がないんだけどよく見ると const char *argv[] っていう引数が結構難解。 文法通りの結果になるような私なりの解釈を書いてみる。これは人によって違いがあると思う。 まずchar *argv[]の解釈だが、そのまえにポインタと配列の宣言の分析をする。 int *abc; これは、*をつけてアクセスしたものはint型(つまりintへのポインタ)で、名前はabcというものを宣言。 int abc[]; これは各要素はintである配列で、名前はabcというものを宣言。 これをふまえてchar *argv[]を考えると *よりも[]のほうが優先順位が高いのでこの順番で解釈し、 ある配列がある。その各要素は*をつけてアクセスするとcharになるもで、その名前(配列の名前)はargv。と解釈し、argv[]はchar型へのポインタの配列で、argvと配列名だけで使用するとその先頭要素を指す。配列の要素のargv[0]はchar型へのポインタ。 また優先順位を意図的に変えたchar (*argv)[]だと、こちらのページが詳しく書いてある。 今こそ再考察! C言語ポインタ徹底解説 「配列へのポインタ」と「2次元配列(配列の配列)」の関係 http://news.mynavi.jp/articles/2008/04/18/pointer/003.html 4ページあるうちの4ページ目です。1ページ目から内容が良いので読むことをおすすめします。 この(*argv)の部分だが「配列の名前が先頭要素へのポインタだから、さらにそれを指すポインタ」と解釈したら間違いらしい。argvはポインタだが指す先は配列の先頭要素。だとすると、*をつけたときとつけないときで何が違うか、というのを疑問に思うが、それも上のページに詳しく書いてある。*をつけるとポインタ加算命令に対して配列ひとつ分進むらしい。なので宣言時に配列の要素数は必須。上のchar (*argv)[]はXcodeのコンパイラだとポインタ演算のところでエラー。 ちなみに配列の名前はポインタと近いが微妙な違いがある。 char *argv[]の間違った解釈としては char型の配列があってその先頭要素を指すポインタをさらに指...

用語

Targeted Device Family iPadアプリか、iPhone/iPod touchアプリか、両方か Project名 .projectファイルの名前 Product name 一体何か? Bundle name 実行ファイルのトップのフォルダに付けられる名前 Executable name 実行ファイル名? Target名 ターゲットの名前 Schime名 スキームの名前

iPhone Core Audioプログラミング

iPhone Core Audioプログラミングという本の感想。 iOSで音を出すやりかたは4パターンほどあります。それぞれ、作りやすさ、機能、理解しやすさなどが違います。全部を網羅しようとすると結構大変なのですが日本語で書かれたiPhone Core Audioプログラミングという良書がありますので助かります。 最初本屋でぱらぱらと見た感じではかなり難しそうな印象があります。特にC言語による部分はObjective-Cに慣れた目には完全に別言語に見えます。 しかし、何度も読んでいくうちにだんだんとCore Audioのパターンが見えてきます。その山を超えるとわりと楽に読めるようになります。 chapter 1 System Sound Service 効果音用のAPIの説明。初めのchapterにしては結構いろんなことが詰め込んである。読むペースをつかむ前に次から次へと話題が変わるので注意。コールバックというのが理解できない場合はchapter 2 AVFoundationを検討するのもいいと思います。 chapter 2 AVFoundation 音を出すAPIの中でこのAPIが一番わかりやすい。ARCならreleaseも必要なし。 chapter 3 項目が多いがひとつひとつは単純な知識。 オーディオフォーマットの情報とパケットの情報を混乱しないようにする。 iOSアプリからプログラムを始めた人は、取得したいデータのアドレスを関数の引数として渡すやり方がイメージしにくいかもしれない。このやり方はCoreAudioではすごくよく使う。 chapter 4 AudioSessionの基礎 ここはどんなアプリを作る場合でも目を通しておいたほうがよいでしょう。 ユーザーの使用状況に応じて音の出力の挙動を変化させること方法が書いてあります。 内容は主に2つ、カテゴリ(アプリは音の扱いをどうするか、マナーモード?に従うとか)の設定と割り込み(電話受信など)への対応。 この割り込みへの対応に2つのやり方が紹介されている。一つは直接AudioSessionを扱うやり方、もうひとつはAVAudioPlayerの機能を使うやり方。 AVAudioPlayerはサウンドの扱いを簡単にするために割と後から出来たもの。ソースから想像するにAV...

clearsContextBeforeDrawing

これはdrawRect実行前に領域を塗り潰すかどうかのパラメータですが、調べれば調べるほど他にもいろいろな設定項目が出てくる、代表的な 芋づるパラメータ です。 他に出てくるパラーメタはopaque(不透明)とbackgroundColorの2つで、 clearsContextBeforeDrawingが2通り opaqueが2通り backgroundColorがnil、transparent(alphaが1未満)、opaque(alphaが1)の3通りありますので 合計12パターンの設定があります。 ややこしいですが、各パラメータの説明のまえに王道をいうと 何かの色で塗りつぶすなら、backgroundColorにベース色を指定します。 透明にしたいならview.backgroundColor = [UIColor clearColor]に指定します。 ただしパフォーマンスを上げたい場合や、仕組みが気になる場合は、各パラメータの意味を理解して対応することになります。 drawRectメソッドの内で領域をすべて塗る場合には効果があります。[UIColor clearColor]は色値とアルファ値が全部0.0のUIColorインスタンス。いわゆる透明な黒というやつである。 詳しく見ていくと backgroundColorが指定され、alphaが1.0の時 その色で塗る opaqueとclearsContextBeforeDrawingの設定による違いはない その色で塗られているので下の画像が塗られているかと前もって領域が透明な黒でクリアされているかは見た目ではわからないがリファレンスによるとクリアされているようだ。 backgroundColorが指定され、alphaが0.0<=alpha<1.0の時 その色を塗りながら下の画像を表示 opaqueとclearsContextBeforeDrawingの設定による違いはない 下の画像が塗られているのでopaqueの設定が無視されるようだ 前もって領域が透明な黒でクリアされているかは見た目からはわからないがこれもリファレンスによるとクリアされているようだ。 上で出した[UIColor clearColor]の場合、全部0.0であろうと指定されているということで、その色(というか...

storyboard細かいことまとめ

自分が作成するアプリの中でわかった細かいこと segueをソースコードから実行することが出来ます。そのためのsegueをあらかじめstoryboardで作成しておくのですが、viewからはSegueが引けない。ViewControllerからは引ける。ViewControllerから引くやり方はステータスバーからcontrol + ドラッグ。あるいはfile's owner立方体アイコンからドラッグ。 segueの強制実行は [self performSegueWithIdentifier:@"segueの名前" sender:self]; で出来ます。 segue実行時に新しいViewControllerに値を渡したいときは、実行時に走るメソッドの - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ } をオーバーライドします。その中で SecondViewController *secondViewController=(SecondViewController *)[segue destinationViewController]; secondViewController.*** = ***; のようにすればよい ただしpushとmodalの違いがあるようである。 上に書いてあるのはmodalでの仕様。pushはまだよくわからない。 また、新しいViewControllerのviewにUIKit部品を置いてある(storyboardで作成してある)場合、UIKitがインスタンス化されるタイミングに気を付ける必要がある。 prepareForSegueの中では、新しいViewControllerにあるインスタンスは生成されているが、UIKit部品はnil状態なのでアクセスできない。 ”おそらく”実行の順番は 1 performSegueWithIdentifier開始 2 新しいViewControllerのインスタンス化(initなど) 3 prepareForSegue開始 4 prepareForSegue終了 5 UIKitのインスタンス化、画面回転メソッドの呼び出し、viewDidLoadなど 6 performSegueWithId...

Xcode4でのアプリの多言語化

多言語化に関するメモ 多言語化の概要 iOSアプリのローカライズは、ファイル単位で行う。この項目をローカライズしたい時はこのファイル、あの項目をローカライズしたい時はあのファイル、というようにローカライズしたい項目に該当するファイルを多言語化させる。 ファイルをローカライズさせると、言語数の分だけ同じ内容のファイルが出来ます。後は各言語毎にファイルを編集します。 はじめにデフォルトを1つ作って(だいたいの場合は英語)それを複製し、それぞれの言語に対応させることがほとんどかと思います。 ローカライズされたファイルはそれぞれの言語フォルダの中に入れられます。 例 ソースが置いてあるところ/en.lproj/Localizable.strings ソースが置いてあるところ/ja.lproj/Localizable.strings 注意点 ファイルのローカライズ状態には、どうも 1,ローカライズされてない 2,ローカライズされているが、en(英語)のみに対応している 3,ローカライズされていて、複数の言語に対応している の3パターンあるようです。1と2の違いに気づきにくい。1から2への変更の場合、何か操作して何も反応がないように見える場合がよくあります。 具体的なやり方 ローカライズしたいファイルを選択し、ファイルインスペクタ(XCodeの右のほうにあるやつ)でLocalizationを行います。 ローカライズすることが多いであろうファイルは storyboard Icon.png InfoPlist.strings アイコンの下に表示するアプリ名 Localizable.strings ソースコード内のNSStringインスタンス など。 プロジェクトの設定のLocalizationsより言語を追加すると一気に複数のファイルを多言語化します。 すると、iPhone用、iPad用それぞれのstoryboard、それからInfoPlist.strings、Icon.pngなど多言語化されます。なにが多言語化されるかはそのときの構成によって違うようです。多言語化出来るものが見つかればそれを多言語化するような感じです。 Xcode4.2でプロジェクトの設定のLocalizationsで多言語化するものは storyboard icon InfoPlist.strings(デフォル...

FindSpeed申請

FindSpeedを申請した。 日本名が「速度の計算」。 小学校の算数で習う、速度、時間、距離の問題を出すアプリ。 3つのうち2つが与えられて残りの1つを計算で求める。 車が走るアニメーションが問題を解くヒントになる。