2008年11月22日土曜日

CS193P Cocoa Programming - 5日目、いよいよView自作

  • Interface Builderを使ったらとにかくWrite Class Files...を押すのを忘れないように
  • 描画はJavaのSwingなどとほぼ同じ
  • drawRectメソッドをオーバーライドして描画する
ViewとかAnimationとか、いよいよ実践が近くなってきたようです。
だんだんと難易度も上がってきました。



まずは自作Viewを作成。
Interface BuilderからUIViewを引っ張ってきて画面上に配置。
クラス名を適当に(ここではPolygonView)に変更。
ControllerクラスやらModelクラスなど、必要に応じてOutletを追加します。
最後に(一番忘れやすいんだけれども)メニューからFile > Write Class Files... この書き出しを行わないとXcode上に実際のソースが出てきません。

書き出しを行ったらXcodeを開いて、以下の2つの仕事を行います。
・先ほど追加したPolygonViewのスーパークラスを定義する
・ControllerにIBOutlet PolygonView *polygonViewを追加する

新しいオブジェクトはWrite Class Filesで一発だと思うけれども、既存のクラス(例えば前回実装したController)なんかは、書き出ししちゃうと上書きしてしまいそう。怖いので今回はXcodeから書くことにしました。でもこれ非常に非効率的。hファイルだけ上書きしてほしいんですけど・・・



勇気を振り絞って上書きWrite Class Files...にチャレンジしたら、なんだかこんなFileMergeとかいうアプリが立ち上がって、きれいにマージすることができましたとさ。よかったよかった。


では早速Viewに描画処理を追加します。
描画を行うのはUIViewの-(void)drawRect:(CGRect)rectメソッドですので、こいつをオーバーライド。
あとは再描画したいタイミングでUIViewのsetNeedsDisplayをコールすれば適切なタイミングでシステムが再描画してくれるというしくみ。Swingに似てますね。



実際に描画してみました。簡単簡単!!



描画のやり方さえわかってしまえばこっちのものです。
ポリゴンの点の位置を計算するメソッドは例題の中で用意されていたので、それを丸コピーして点の位置に線を引くだけ。線の太さを調節する関数はCGContextSetLineWidthというのが見つかったのでそれを使うだけ。リファレンスが使いやすい!すてき!



カスタムビューの中にUILabelを追加して、ラベルにポリゴンの名称を表示できるようにしてみました。UILabel.textプロパティを書き換えるタイミングはカスタムビューのdrawRectの中で。ほかに良いタイミングが見当たらず。


ひとまずこんなところですかね。次は・・・
  • スライダーで線の太さを変える
  • 線の種類を何らかのスイッチで変える
  • ビューの上でフリックしたらポリゴンがくるくる回るようにする(アニメーション処理の勉強が必要)
これらを試してみたいですね。

iPhone OS 2.2にアップグレードに失敗、ずいぶんと酷い目にあいました

  • iPhone OS 2.2へのアップグレード時に途中でエラーが出て中断、そのままインストールが再開できず
  • ケーブルを接続し直したり再起動したりHomeボタン押しっぱなしでセーフモード起動してもiTunesが認識せず
  • 結局Macbook Airにつないでみたら一発でリカバリモードで認識してくれたので助かった
  • ということでiPhoneで本当に困ったときはMacにつなげ、Windowsは信用ならない
  • いつのまにやらiPhone上のi.softbank.jpメールアドレスの設定が非常に簡単になっている(メアドとパスを入れるだけですべてやってくれる)

iPhone OS 2.2が事前予想通りにリリースされたので、さっそくアップデートを試みました。
が・・・途中で原因不明のエラーが出てアップグレードに失敗してしまいました。
そのままiTunesが何度やってもiPhoneを認識しないと言う事態に陥り、あわや愛しのiPhoneが6万円の格好いい板になりはてるかと気が気ではありませんでした。
結局Macにつないでみると無事認識してくれたので、そのままiTunesから復元を試みて無事復活。やれやれです。
基本設定が全部吹っ飛んでしまいましたが、アプリのデータなどはすべてWebサービス上にあるため全く無傷でした。おかげさまでiPhoneが無事立ち上がってからは1時間もかからずにすべてのデータを復元できました。クラウドコンピューティングの強力さを改めて実感です。


メールアカウントを設定し直す際に気づいたのですが、いつのまにかi.softbank.jpメールアドレスの設定が極めて簡単になっています。
以前は設定時にSSL通信を使わないようにしたり、IMAPとSMTPサーバー名を自分で設定する必要があったのですが、今日試してみたらメールアドレスとパスワードを入れるだけで全部自動でやってくれました。

それからiPhone 2.2といえばなんと言っても顔文字。コレで日本語キーボードがQWERTY、10キー、そして顔文字と3つになってしまいました。どれだけ日本語入力に力を入れてるんだって感じです。


メールの設定が楽になったり、顔文字が使えたりワンセグを見れるようにしたりと精力的に対応してくださって本当に助かるのですが、
それでもやっぱり、アップデートを行っただけで二度と起動しなくなってMacにつながない限り復元できなくなるようでは、とてもじゃないですが普通の人にiPhoneをお勧めは出来ないですね-。
だってこんなのが100万台も日本で売れたら、きっとソフトバンクモバイルのカスタマーサポートの中の人がストレスと過労でみんな死んでしまいますよ?

2008年11月17日月曜日

CS193P Cocoa Programming - 現在4日目

  • メモリの管理についてお勉強
  • allocで領域確保(オーバーライドしない)
  • initで初期化(オーバーライドして使う)
  • 同一オブジェクトを参照するときはretain(オーバーライドしない)
  • コピーするときはcopy(オーバーライドしない、copyWithZoneをオーバーライドするべき)
  • 解放するときはrelease(オーバーライドしない)
  • 実際にメモリから削除されるのはdealloc(オーバーライドして使う)
  • NSAutoReleasePoolとautoreleaseメソッド・・・事前にautoreleaseしておいたオブジェクトは[NSAutoReleasePool releaseまたはdrain]呼び出し時に一斉に解放される

1日に二日分前進。iPhone発売から既に4ヶ月経過、既に無数の超優良アプリがわんさかと出回っています。果たして私は遅れを取り戻せるでしょうか。


これはNSURLから文字列を取得する方法を模索していたときです。
結局、absoluteStringかrelativeStringが正解ということがわかりました。


クラスの作成とメモリ管理。ようやくCらしくなってきたかな?
Objective-Cではガベージコレクションもできるらしいのですが、iPhone開発ではガベージコレクタをぶん回せるだけのリソースはないため昔ながらのメモリ管理でやる必要があります。



いろんなイニシャライザをためしてみました。
リストにオブジェクトを突っ込んだときは、突っ込んでいるNSArray自身もリリースしないと、個々のオブジェクトがリリースされません。おそらく内部でretainされてるんでしょうね。



introspection(Javaでいうところのrefrection)にチャレンジ。instanceof演算子みたいなのはなくて、すべてNSObjectのメソッドとして提供されています。java.lang.refrectionパッケージみたいな面倒さはないです。あとセレクタはSEL型とかいう専用の型があって便利。いわゆる関数へのポインタとして使えます。Javaの何が不満ってこの関数ポインタがないところですよ。



続けてもう一つの宿題のほう(Assignment2B)に突入。いよいよ実際に動作するiPhoneアプリを作ることになるのですが、その前に一つ宿題にバグ?があったのでご報告。
上の画像のカーソルで選択している部分(PolygonShape.h)、Assignment2Aで作成したときにはCocoa/Cocoa.hをインポートしていますが、2BではCocoaが使えない(iPhoneアプリになるため)ので、Foundation/Foundation.hに書き換える必要がありました。



で、これが完成品です。
SwingやWin32API開発並みの苦行を覚悟していたのですが、あまりに簡単で逆に拍子抜け。はまりそうな点といえば、プロジェクトに新しくクラスをインポートしたり作成した後はInterface Builderからアプリケーションに登録しなければならないというところぐらいでしょうか。あと、awakeFromNibはコントローラに実装しないとだめ(間違えてPolygonShapeに一生懸命実装して、ビルド直前にこの過ちに気づきました)。


今のところは楽勝。問題はOpen GL ESに手を出すあたりからでしょうかね。