2011年10月16日日曜日

メモリ不足で追加ボタンが消える


 原図のサイズを変えようとするとクラッシュするのは、Setterの中でSetterを呼んで無限ループに陥るという単純なミスが原因だった。変数名がアンダーバーから始まるのが嫌だったので修正していたのだが、そこで機械的に置き換えてしまったらしい。そちらは単純ミスだからまあ良いのだが、タイトルの追加ボタンが消える問題には少々手こずった。

現象
 Repeating Motif Generator for iPadはSplit View-based Applicationなのだが、左ペインに紋様リストを表示するテーブルビュー、右ペインに選択された繰返し紋様を表示する。左ペインのナビゲーションバーには追加ボタンがあるのだが、実機テスト中にこれが消える現象が発生した。シミュレータでは「メモリ警告をシミュレート」すると再現する。viewDidUnloadでaddButtonをreleaseしているのだが、viewDidLoadで再ロードされてアウトレットに接続される筈だ。だからボタンが消える筈はない。ところが現実にはそうならない。いくらソースコードを眺めても原因が分からなかったのだが、それも当然で、原因はnibファイルの作り方にあった。

原因
 Split View-based ApplicationのテンプレートにMainWindow.xibがあるのだが、今まではその中にaddButtonを作って入れていた。だがよく考えてみれば、RootViewControllerとMainWindow.xibには何の関連もない。調べてみたがRootViewControllerのnibNameプロパティには何もセットされていないのだ。これではviewDidLoadで追加ボタンが再ロードされて、アウトレットに接続される訳はない。

対策
 そこで対策としてRootView.xibを新たに作成し、そこにaddButtonを移した。RootView.xibのFile's OwnerにはRootViewControllerを指定する。RootView.xibにはTable Viewを作り、File's OwnerのviewアウトレットにそのTable Viewを接続する。MainWindow.xibのRootViewControllerではaddButtonのアウトレット接続を外し、アトリビュートインスペクタでNIB NameをRootViewと指定する。要するにDetailViewと同じ構成にした訳だ。これでソースコードを一切変えずに問題が解決した。
 MainWindow.xibにボタンを作っても最初は動いてしまうというのが落とし穴だ。全く動かなければすぐに気づいたのだが。

0 件のコメント:

コメントを投稿