iUnitTestを使ってみた。17:40伊藤ソフトデザインさんがiPhone向けユニットテストフレームワーク「iUnitTest」をGitHubで公開(SourceForgeの記事)していて、その評判が良いので使ってみることにしました。使いこなし方がよく分かっていないので、今回はインストールと使い始めのところだけ(リアルタイムに)記録しています。インストール次の手順で行いました。GitHubからソース一式を持ってきて、展開。ReadMe.jp.txtをCarbonEmacsで読む(テキストエディットだと文字コードのせいか開けなかった)。./setup」を実行。同じフォルダにはsetup.rbもあるけれどコチラじゃない*1。→Xcodeの新規プロジェクト/新規ファイルでiUnitTest用のプロジェクトやクラスが作成できるようになる簡単ですね。setup処理もすぐ終わりました。サンプルを見て、知るReadMeに「サンプルプロジェクト'PrefecturesTest'を見てください」とあるので見てみることに。ふむふむ、プロジェクトを開いたときにある「TargetClasses」グループにテストしたいクラスを置いて、そして「Tests」にはインストール作業で使えるようになったiUnitTest用クラスを置くといいんですね。内のファイルを「プロジェクトを基準」で参照するようになっている。・・・そうか、テストプロジェクトで分かった不具合の修正を本プロジェクトに即座に反映させるためか。この「テストプロジェクトにはコピーではなく参照でターゲットファイルを含めること」は今後の注意事項として覚えておこうっと。それ以外をざっと見ても、このファイルはプロジェクトで使うファイルそのままで、特に何もiUnitTest用には手が加えられていないことを確認。次に「Tests」グループのファイル。この〜Testというファイルの中で、テストしたいクラスのインスタンスを作成し、そのテストケースを「test」で始まるメソッドに書いてあげればいいんだな。*)rootViewControllerで、テスト対象のクラスがインスタンス化されるようクラス名を変更しているtestで始まっていればテストメソッド名は何でもよいみたい各テストメソッドそれぞれでテスト対象クラスをインスタンス化しなくても良い(毎回インスタンス化されるという情報をいただきました)Testsというセクションにテストが書いてある(場所は関係ないと思うけれど・・・)。別に「Helpers」として何か書かなくても良いっぽいサンプルプロジェクトでは「ASSERT_EQUAL」「ASSERT_EQUAL_INT」が使われているなど。どんなテスト用マクロがあるの?ASSERT_〜はIUTAssertion.hに書いてあったので、マクロだけ抜粋してみました。SAMEとEQUALの違いなども元ソースを調べて書いてあるので、単なるコピペではないです。指定した処理で例外が発生しないことを期待する色々あるものですね。自分でテストプロジェクトを作ってみる・・・。・・・すみません、ここでブログを書く力が尽きてしまいました。詳しいことは作者のブログ「はてなブログ」にあるPDFファイルを見ていただくといいと思います。ここで書こうと思っていたことが分かりやすく書いてあったので、という言い訳をさせてくださいな。まとめObjective-Cって素敵!はてなグループのエディタUIはダイアリのそれと比べてすごく書きにくい!その他で気づいた点Objective-C++ファイル(.mm)でもテスト対象にできました。テストケースの拡張子もmmにしておけば大丈夫のようです。参考にならなかったかもしれませんが、そのへんはご容赦ください。*1:setupの中身を見ると分かるけど、実はsetup.rbを呼んでいるだけなんですけどね。23:35マクロをまとめていただいてありがとうございます。>毎回インスタンス化される?使い回される?ここは毎回インスタンス化されます。ReadMe.jp.txtには書き忘れてますが、opencodeも併用してみて下さい。21:08コメントありがとうございます。使いこなしている状態ではないので恐縮です。毎回インスタンス化されるんですね。なればテストは前後のテスト状態を気にせず使えると理解しました。確かに、使い回されるとテストがテストである意味がなくなってしまいますものね。opencodeも参考にさせてもらいます。ありがとうございました。11:06アプリを操作している最中、アプリへの割り込みとして次のイベントが起こりえます。スリープボタンが押されるホームボタンを素早く2回押されて、ミュージックメニューが表示される電話を着信する(?iPhoneを持っていないので分かりません。だれか教えてください)このときにアプリの動作を一時的に止めておきたい、そしてアプリに戻ってきたときに再び動作を再開したい、というようなニーズがあると思います。今、私はメトロノームのアプリを作成しているのですが、スリープしている最中に「チックタック」動いてほしくないし、UIデザインから見ても止めておくのが妥当ですよね。その場合には、UIApplicationDelegateを実装しているクラスにて、次のメソッドを作っておいてあげれば良いようです。__LINE__);}こんな感じ。「音と画像を同期させている(ように見せている)」アプリの場合はスリープ時に動作を止めておかないと、スリープ解除したときに音と画像がずれて表示されるようになってしまうので注意です。ゲームなんかでも「スリープしてたら勝手にゲームが終わってた」はイヤですものね。11:28アプリをリリース後、すぐに次のソフトを作りたくなるのが人の佐賀というものです。初出アプリが私のようにこっぱずかしいショボソフトであれば、そのまま売れなくなったらもうダメだろうなと思ってしまいたくなるのも分かります*1。ハイスミマセン、リリースしてからまだ一度もアップデートをリリースしていないです。色々な話を聞いていると、アプリをアップデートした場合は新着リストにアプリが載って、つまりまた人の目に晒してくれるようなので、また少し買ってくれる人が出てくれるかもしれないとのことです。儲けるチャンスはあると言うことですね。それを聞いて、「これまでアプリを買ってくれた人への恩返しにアップデートを考えようかな」と思い始めました。前の段落と言っているコンテキストが違う。」というブログを書いているSato氏と、SingingCatのid:frnk氏に以下のアドバイスをいただきました。Connectをまずチェック。いう一手間が売上増につながっていくのですね。ありがとうございました。参考サイトfrnk氏がまとめた、もっと分かりやすい記事です。今日(2009/5/25)時点での最新情報も追記されていますので、チェックしてみてください。らっこのじゆうちょう*1:おかげさまで世界で40本くらい売れたのですが。17:20※UIPickerViewではまってしまっていたことの備忘録です。OS3.0ではどうなっているか分かりませんので*1、あくまで2.2.1ということで。例のドラム型のピッカーUI(UIPickerView)では、アイテムの表示方法に2種類のデリゲートを用意しています。{}ちなみに2が書いてある場合、1は書いてあっても無視されます。2でnilを返しても同様。後者を使う場合には、次のようにして既存ビューの存在を確かめつつ、その中の情報を埋めていくわけで。Rectangleの適当なサイズや、フォントが分かっていない。ここでの23pxの高さは目測で調べました。view;}ポイントはビューの座標。各要素での{0,0}の位置はPicker内各Rowのど真ん中にあるらしく、サンプルのように負数を指定してあげないとどこかに寄った状態になってしまうみたいです。事前に指定しておいたrowの幅の半分の値をセットとしてあげると良いみたいです。最初、このことが分からずに一向に情報を表示してくれないPickerViewに業を煮やしておりましたです、ハイ。補足UIViewを返すデリゲート、必ずUIViewを返さないとうまく動いてくれません。このサイトやこのサイトで紹介されているようなUILabelを直接渡してあげる方法は、少なくとも私の環境(2.2.1)では何も表示されませんでした。この方法で表示している方がいたらば教えてください。現在の不明点UIPickerViewでデフォルトで使用されるフォントや、そのサイズ*1:分かったとしても書けないし。23:17サンプルコードありがとうございます!おかげさまで、無事自作のUIPickerViewを作ることが出来ました。ところで、文中ではUILabelを直接渡す方法ができないとおっしゃってますが、試したところ無事成功する方法を見つけたのでサンプルコードをご紹介させていただきますね。http://akisute.com/2009/06/uipickerview.htmlそれではまたー。21:26「UILabelのframe.size.heightが0になってしまっていた(要するにつぶれてしまっていた)のが原因」だったんですね。ありがとうございます!お互い頑張っていきましょう。AnimationではCABasicAnimationクラスに色々とプロパティを設定することで、アニメーションがどう振る舞うか(始点と終点)アニメーションのタイプ(移動、回転、サイズ変更など)アニメーションの長さアニメーションの繰り返し回数などが設定できます。10;というように設定することで、設定したアプリを「10回繰り返す」というように宣言できます。・・・さて、ここで困ったのが次の疑問:『アニメーションを永遠に繰り返すにはどうしたらいいのか』でした。Appleのドキュメントを見ても、それらしいプロパティはないし、試しに「-1」を設定してみても効果無し*1。便利なフレームワークなのにどうしたものかなぁ、とググっていたら、Appleがボクの質問にまさしく答えてくれるドキュメントを出していることに気づきました。Google検索結果の見出しでは以下の記述。アニメーションは1秒の長さで、無限に反復します。アニメーションが1.5に到達すると、また0に戻り、繰り返されます。次のコードでこれを設定します。...「これだ!やった、さすがアップル!」と期待して開いてみたら、そこにはこんなコードが。・・・あ、そうですか。これを「無限」て言いますか。これでアニメーションがいつまでも繰り返されている(ように見せる)処理が分かりました。めでたし、めでたし?繰り返し回数についての追記その後分かったことです。repeatCountはfloatで定義されているので、“2.75”という指定をすると、「2回繰り返し、3回目の75%まで進んだところで止まる」という動作になることが分かりました。あとautoreversesがYESの場合、reverseぶんの動作も含めて「1回」とカウントされるのでご注意を。20:07使っても審査に通るかどうかは分かりませんが、stackoverflowで「自分のiPhoneの電話番号を取得する方法」が載っていたので、メモとしてこちらにも載せておきます。stringForKey:@"SBFormattedPhoneNumber"];これだけ。touchではnilが返ってくることを確認しました。・・・いいなぁ、欲しいなぁ、iPhone。MetronomeサンプルプログラムのViewクラスを可視化してみた。21:56手作業なんですが、Metronomeサンプルアプリの「錘を上下に動かすとテンポが変わる」「音が鳴る/止まる」などの操作性をどのように実現しているのかな、と関数呼び出しの関係を図示してみることにしました。1クラス内の出来事なので、関数コールグラフのように書いています。二重線がpublicメソッドです。設計をきちんとしてから作ったのだろか。しているし、同じような処理が複数箇所に跨がっていたり。正直なところ、あまり参考になりませんでした。NULL);みたいに初期化してから、次のようにカテゴリを指定します。&category);このカテゴリについて調べてみることにしました。・・・が、まだ途中ですのでメモ程度になっています。カテゴリは次のようにenumで定義されています。AudioCategory」で確認できます(有益な情報をまとめてくださった同ブログの著者には多謝です)。色々なソースを見ていると、どうも再生中の曲そのままで効果音を鳴らせるkAudioSessionCategory_AmbientSoundをほとんどのケースで使っています。有名なゲームやソフトでもそうなので、多分それで良いんだと思うのですが、効果音としては本当に適当なのかが微妙。「そもそもレスポンス性能との違いは何?」みたいな疑問が湧いてきます。変化させてみたけれど、聴覚上の変化はほとんどなし。Reference(PDF注意)」にもう少し詳しい説明が載っていました。application.だそうです。OSの機能は制限されているから、Mac向けの資料にまで視野を広げた方が良さそうな雰囲気がすることは分かりました。autoreleaseまわりの...。