万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

南東京iPhone勉強会

3.岸川

UIVewControllerのコーナーケース(落とし穴)

iOS View Controllerプログラミングガイド
Cocoaメモリ管理プログラミングガイド
ドキュメントに目を通しておこう。

・基本
(現在の)Apple推奨の書き方
※2.0と生成されるのが違うから

プロパティではなく、インスタンス変数に行う。

●アウトレットはプロパティが存在すれば(setterメソッドが実装されていれば)setter経由で設定される。

●setterが存在しない場合、直接インスタンス変数に設定される(retainされる)

releaseで開放してあげること。

Cocoaメモリ管理プログラミングガイドにsetterがない場合はretainする
MacアプリはiPhoneよりも落とし穴が多い。

InterfaceBuilderを使わない場合でも

メモリ管理が少し簡単になるから。iPhoneはメモリエラーはすぐクラッシュ。

そのインスタンスの状態がどうであっても
self.propertyName = nil;と書けばOK
retainやassinだろうが。
nilで開放するというルール付けをする。
プロパティの代入もself.propertyName = [[[XX aaloc] init] autorelease];

iPhoneアプリくらいの規模なら〜〜
公開して使ってもらう場合や(特にライブラリなど)
素人がメンバーにいる場合を除く

■ビューのライフサイクル
UIViewController

Viewを切り替えるときにdisappearが頻繁に呼ばれる。

loadView、viewDidLoadは複数回呼ばれる。
ナビゲーションを経由して何もなければ呼ばれない。
loadViewは何度呼ばれたかを気にしなくて良い。※正しく実装していたら(毎回初期化)
Viewプロパティ、〜.view
contentView
self.viewにaddしてreleaseしてしまう。

表のViewでなければ破棄
viewDidUnload

前のが残ったようにしないといけない
乗らないViewなどを NavigationViewに乗せたものとか

self.〜〜でやっておくと、nilを代入するだけでよくなり、めんどくさいことを考えなくて良い。
プロパティの代入はメソッドの呼び出しになるので、オーバーヘッドになる。
メソッド呼び出しを減らす(パフォーマンスチューニング)
deallocはinitやdidUnloadで呼ばれたのを書く。

viewDidUnloadに書いたからと言って、deallocに書いてないのはいけない。

メモリ警告が発生した裏のビューコントローラ
ツイッター テーブルビューが表示

ウインドウ以外のビューに
[view add];

テンプレートメソッド・パターン
処理内容は異なるけど手順は決まっている。

CornerCase:
iPhone4よりiPhone3GSのほうがメモリに余裕がある
iPad, iPhone4は同じ感覚

(例)バックグラウンドに入ったときはアラートやモーダルビューは閉じたほうがいい

CornerCase:
ポップオーバーを同時に2つ以上表示すると高い確率でリジェクト