[iPhone]スタンフォード大学iPhone app講義のpodcast第8, 9回
第8回、9回講義(2009/04/27、29、要iTunes)聴講。第8回はUITableView(+UIScrollView)について、第9回はデータの読み込み・書き込みについて幅広く紹介。
第8回
ゲストスピーカーにUITableViewの開発チームの人(Jason Beaver)を呼んでTableViewについて解説してもらっているがこれが失敗。レクチャー慣れしていならしくUITableViewについて淡々と解説していくだけで、時折ソースコードなどを交えながら解説するも、すでに自前で書き終えたソースをズラズラ見せられるだけなので何を説明したいのか伝わってこない。特に目新しいことを説明しているわけでもないので、これなら教本でじっくり理解した方が良い。(おそろしいことに第9回の解説はUITableViewをすでに理解しているという前提の上に進んでいく)
第9回
こちらのスピーカーはいつものEvan Doll。Data persistenceについて、Property listやData archivingといったCocoaでよく見るデータ読み書き方法だけでなく、SQLiteをiPhone OS内で使うところまでも実際のコードを交えて解説(むしろSQLiteメインな解説だった)。外部データを扱う場面でもJSONの解説に時間が割かれている(一瞬だがFlickrからデータを取得するデモ付き)。このiPhone appコースだが、世にある書籍に書かれていない内容を意識的に扱うようにしているように感じられとても好印象だ。
- NSUserDefaultsもplistファイルを作成していることを知った。iPhoneシミュレーターで確認したらたしかにplistで保存されていた。これは便利。
~/Library/Application Support/iPhone Simulator/ User/Applications/APP_ID/Library/Preferences/
- さらに洗練されたデータ構造としてCore Dataをちらっと紹介。iPhone OS 2.xでは使えないと強調していたのでOS 3.0から使えるようになるのかな。
- 前々回(第7回)に引き続き、グローバル変数やシングルトンモデルを使うなと強調。前回は理由が納得できなかったが、特定のモジュールの単体テストができなくなることを理由に挙げていた。なるほど納得。
- 重要な内容なのに講義最後5分間ぐらいしか解説されていないが、idやプロトコルで定義されているインスタンス変数(例えばdelegate)のSetter/Getterの書き方やリリース方法について。何故retainではなくassignを使うべきなのか理由が今イチ理解できず。絵にしてもらえたらよかった。
[iPhone]スタンフォード大学iPhone app講義のpodcast第6, 7回
第6回、7回講義(2009/04/20、22、要iTunes)聴講。第6回はUIViewControllerについて、第7回はUINavigationControllerについて。
第6回
何もない。マジで何も感想がない。UIViewControllerを知らない人以外は見なくてよい(かも)。ただ、後半にNSUserDefaultsを使ったデータ保存の簡単なデモをやっていたのでData persistenceについて知らない人には有益(かも)。
第7回
第6回と異なり、良い意味で細かい情報満載だった。Dave Mark - Beginning iPhone DevelopmentやErica Sadun - The iPhone Developer’s Cookbookに解説されていない有益な情報多数、UINavigationControllerは思っていた以上にフレキシブルなことがわかった。UINavigationControllerはUITableViewとあわせて説明されている場合が多いが(欲張りな教本では一緒くたに解説されていることが多い)、今回はUITableViewは一切用いず説明しているため構造が理解しやすくなっている。
- 意外だったのだけど、UINavigationController配下(に限ったことではないが)のViewController間のデータの受け渡しはグローバル変数(Singletonモデルなど)を用いずに引数でちゃんと渡せと強調していた。コントローラーが再利用しにくくなるからとか何とか一般的な説明をしていたが、そもそもCocoaのコントローラー、特にViewControllerを再利用する機会があるのかどうか疑わしい。
- UIViewController.navigationControllerというプロパティが存在した!UINavigationController配下のViewControllerはAppDelegateなどを呼び出さずにUINavigationControllerオブジェクトにアクセスできる(UINavigationController配下でない場合はもちろんnil)。
- UIBarButtonSystemItemの存在を知った!APIドキュメント見たら20個ぐらい種類あって、しかもマーク画像まで掲載されていて感動。例えばプラスマーク表示したい時は、
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(add:)]; self.navigationItem.rightBarButtonItem = item; [item release];
(注意: ViewController内にadd:メソッドが定義済みと仮定)
- Backボタン(戻るボタン)の名前の変更方法があった!例えば親ViewController内に
self.title = @"This is my title"; UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:nil action:nil]; self.navigationItem.backBarButtonItem = backButtonItem; [backButtonItem release];
と書いておくと、子ViewController内に表示されるBackボタンのタイトルを”This is my title”から”Back”に表示変更できる。(Backボタンはtargetもactionも設定不要)
[iPhone]スタンフォード大学iPhone app講義のpodcast第5回
第5回講義(2009/04/15、要iTunes)聴講。UIViewクラス(Flashで言うところのDisplayObject)について、クラス説明、描画方法(Core Graphics)、ビルトインアニメーションについてなど濃い内容だった。後半20分ほどライブコーディングもありおもしろかった。
- UIView.frameとUIView.boundsの違いについて図でわかりやすく説明。
- drawRect:を他から直接呼ぶべきでない理由を説明していたが、あまり納得できず。ちなみにdeallocを直接呼ぶべきでない理由も僕は理解していない。なんでそんなメソッドがパブリック状態で野放しなのかね。パブリックと言えば、Objective-Cのメソッドはアクセス制御不能で基本的に全部パブリック(プロパティは制御可能)。隠蔽したい場合はカテゴリを使ったりして一工夫しないといけない(例えばPrivate Methods)。
- UIView.centerというプロパティが存在した!聴講してなかったら一生気付かなかったかもしれない。
- UIViewのビルトインアニメーションについて結構な時間を割いて説明していた。食わず嫌いをしていたので知るよい機会になった。全てUIViewのクラスメソッドで設定できるので、よく使うアニメーション効果などはカテゴリで作っておくと便利かもしれない(例えばUIViewのフェードイン/フェードアウト)。
- マウス追従するUIViewアニメーションのライブコーディング。名前のクソ長いdelegateメソッドなどはドキュメントからコピーペーストして使っていた。やはり覚えられるもんじゃないんだな。スラスラ完成させて拍手で講義終了。
[iPhone]スタンフォード大学iPhone app講義のpodcast第4回
第4回講義(2009/04/13、要iTunes)聴講。第3回に引き続きUIKit(Cocoaフレームワーク)の説明。Delegate、MVC、Nibファイルについてなどフレームワークの骨格に関する内容だった。正直あんまり感想がない。
- CocoaのMVCの構造はいわゆるデザインパターンのMVCと構造が異なる(ModelとViewに依存関係がない)。MVCパターンは、「MとVとCの依存関係をできるだけ対等になくしてやる」という思想の上に成り立っていると考えると、Cocoa型MVC(Controller司令塔型)は異端児と言える。といっても僕も少し前までCocoa型MVCをMVCパターンだと思っていたが(MVCオルタナティブ - boreal-kiss.com)。
- 後半はNibファイルの話だがわかりにくかった。
- 放送用のためか、生徒の質問(マイク無し)を先生が繰り返すし発言するようになっていた。ラジオリスナー側には今まで聞こえなかったのでこれは非常に助かる。
[iPhone]スタンフォード大学iPhone app講義のpodcast第3回
第3回講義(2009/04/08、要iTunes)聴講。丸々一時間メモリ管理に関する話で有益だった。カスタムクラスを作成しながらretainカウント方式とプロパティ属性(setter/getter)の説明などが行われる。ライブコーディングなし。講義で特に良いと思ったのは以下。
- autoreleaseの仕組みについての詳細な説明。iPhone関連書籍は数あれど、実際どのタイミングでautoreleaseが機能しているのかまで言及しているものは少ない(Aaron Hillegass本に書かれているがこれはCocoa専門書)。その場しのぎで作成したオブジェクト以外にautoreleaseを使うと危険なことがわかった。
- プロパティ属性(@propertyと@synthesize)を使うことで実際に書く手間が省けたコード内容の説明。こちらもiPhone関連本には詳細は載っていない場合が多い(Appleのドキュメントには書かれている)。一番知りたかったatomic, nonatomicについては講義では触れていなかった。
おまけ
retainカウント方式はコードが煩雑になりやすいのでちょっとした書き忘れなどが原因で無駄なメモリを使わせることが多々ある(iPhoneはメモリ使用量がシビアなのでこれが致命傷になることも)。しかもどこでrelease忘れが生じているか中々見つからず無駄な時間ばかりとられることになる。そういうときはLLVM/Clang Static Analyzerがおすすめ。ビルド内容(?)を読み取って、ソースコードの問題点(release忘れ箇所)を見やすいhtmlで出力してくれる。コマンドラインによる動作が障壁になるかもしれないが小難しい操作ではない。実際の使用状況はclangでObjective-Cプログラムを静的解析 - きりかリポーツを参照ください。


