南東京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つ以上表示すると高い確率でリジェクト