ミネルヴァの梟は黄昏とともに飛び始める

ミネルヴァの梟は黄昏とともに飛び始める

Follow me on Twitter: http://www.twitter.com/dddaisuke

[Xcode] Interface BuilderのIB接続に関する問題 その2

without comments

こちらのエントリーとは別のエラーで、次のようなエラーを吐いて落ちる問題がある。

-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “XxxxxxView” nib but the view outlet was not set.’

これは、File’s OwnerとViewのコネクションが張られていない事が原因で出るエラーなので、以下のようにFile’s Ownerを選択して、viewとViewを以下のように繋いでやると良い。

Written by daisuke

8月 27th, 2010 at 9:38 pm

[Xcode] EXEC_BAD_ACCESSのデバッグ方法

without comments

EXEC_BAC_ACCESSとは、いわゆる不正なメモリアクセス(ポインタ操作)を行った際に発生するエラーである。通常は、解放済みの変数にアクセスしようとしたり、解放済みの変数をもう一度解放したりなどが、それにあたる。

ここ1週間Objective-Cを使ってみた感じでは、ポインタと言ってもゴリゴリとポインタの数値を直接操作する機会は無く、単に参照を持つというのに使うことがほとんどのようだ。

不正なメモリアクセスに関しては、ツールさえあれば原因を調べやすい類のバグなので安心して欲しい。ここでは、便利なデバッグオプションを紹介したいと思う。

Xcodeのメニューから「プロジェクト」-「アクティブな実行ファイル」を選び、「引数」タブにある「環境変数」に以下の4項目を設定すると原因は一目瞭然になる。

MallocStackLogging=YES
MallocStackLoggingNoCompat=YES
NSZombieEnabled=YES
NSDebugEnabled=YES

ただし、上の2つに関してはメモリーを消費しやすいので、搭載メモリーが少ないiPadなど実機デバイスを利用したクロスデバッグ時には、このオプションが原因で落ちる事もあるようなので、注意したい。

Written by daisuke

8月 27th, 2010 at 9:22 pm

[Xcode] Interface BuilderのIB接続に関する問題

without comments

Xcodeでの開発において、UIの構築で力を発揮するのがInerface Builderだ。Interface Builderを利用すると、ビューとコードを簡単に分離する事ができ、Xcodeでの開発でこれを利用しないのはバカだと断言できるレベルで非常にパワフルな機能を提供してくれる。しかも!デザインセンスが無い人でもそこそこの見た目に仕上げる事ができる。(もちろんInterface Builderはデザイナーとプログラマーの作業分離用に用意されていると思うが、Interface Builderを使ったからと言って、おそらくそんなに都合良くまわら無いと思う)

Interface Builderを利用すると何が便利かと、以下のようにUI上で線を結ぶだけでメンバー変数とテキストフィールドを関連づけたり、メソッドとボタンのクリックを関連づけたりできたりする。また、UIとコード間のデータのやり取りに関する処理はすべて内部で請け負ってくれ、コードを書く側はメンバー変数やメソッドの宣言時に識別子を書いておくだけで、UIの値やイベントが勝手に飛んでくるという手軽さ。

さて、今回のエントリーの本題に入りたいと思うが、このInterface Builderは非常にパワプルである一方、致命的に問題だと思う部分がある。(ちなみに、私は今日現在で1週間程度しかXcodeを触っていないので、勘違いしている可能性が十分にある事を前置きしておく

その問題点は、この関連づけ(コネクション)の一覧を表示する仕組みが存在しない事である。ビュー単位では確認できるのだが、プログラム全体でコネクションの関係を閲覧する事ができない。

なぜこれが問題かと言うと、Controller(ソースコード側)の名前を変更したり削除した際には、Interface Builder側からコネクションを切断するか、コネクションを張り直してやらないとエラーを吐いて落ちるのである。コンパイラかプリプロセッサで弾けば良いと思うのだが、ご丁寧に実行時に落ちてくれる。

しかもXcode側で、名前の変更・削除をした際に、リファクタリングや警告の表示といった事が一切行われないのである。

[<UIViewController 0x55169b0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key xxxxxx

プログラムが落ちる時には、上記のようなエラーを吐いて落ちる。もちろんkey xxxxxで示されるIBOutletの対応がおかしくなっている場合があるが、それは明らかなので、検索などでこのページにたどり着いた方は、おそらくエラーを吐くコードに対応した.xibファイルのコネクションはすべて確認されていると思うのでぜひ次の点を確認して欲しい。

これは、私もハマった点なのだが、Controllerの名前を変更してコネクションの不一致が発生した場合は、そのビューだけでなく、そのビューに遷移する前のビューのボタンなどのコネクションを確認して欲しい。遷移先で利用するControllerが指定されていると思うので、このコネクションを張り直すと動くようになると思う。

———-

Xcode/Interface Builderは全体的に使いにくい部分が結構ある。これは、Apple特有のデザインに偏った部分が問題になっているというよりは、競争が全くないというのが問題になっている気がする。

Appleが用意しているUI framework群が非常に優れているだけに、IDEの使いにくさでマイナスになっているのはもったいない。ぜひとも改善して欲しい。

Written by daisuke

8月 27th, 2010 at 9:05 pm