You are here: Home / TinBlog / XcodeのQuickHelpが、たまに拗ねる件。

XcodeのQuickHelpが、たまに拗ねる件。

Posted by h2 at Apr 26, 2012 04:39 PM |
Filed under: ,
iPhoneアプリ作成に必須のXcode。バージョンにより安定性やら使い心地やらがゴロゴロ変わる厄介者だが、現在使用している4.3系列は、比較的安定して使用できている。たまに、長時間(10時間とか)叩きっぱなしにしているとキャッシュがフローするのか自爆することがあるけど。そんな自爆のなかに、「いきなりQuickHelpが動かなくなる」という頭の痛い問題があったのだけど、どうやら原因らしきものが判明。

現在使用しているXcodeは、v4.3.2。このバージョンは、比較的安定しているので有り難い。

・・・が、以前からある「あるときから、いきなりQuickHelpが動かなくなる」という困った現象が発生した。

 

QuickHelpとはなんぞや、というに、

1. ソースコード内で、ライブラリ等で定義済みの構造体やら変数やらに色づけしてくれる。

2. キーワード上で、 Command+クリックOption+クリックすると出てくるヘルプバルーン。

3. 既知の関数名やらクラス名やらを途中まで入力すると、自動的に補間コード候補を表示してくれる(Code Completion)。

といった動作の根幹にあるサポート機能のこと。

 

この機能、以前のバージョンから、たまにまともに動作しなくなることがあって、いろいろ困っていたのだ。

これが動かなくなると、

・キーワードのタイプミスを発見しづらい。NSIntegerとかCGPointなどまでが黒字表示になってしまう。

・メソッドをオーバーライドしたいので元のクラスのヘッダを表示したいのに、「そんなクラス知らん」と言われる。

・ヘルプを確認するのに、いちいちオーガナイザのドキュメントから検索しなくてはならない。

・長ったらしいメソッド名を、全部手打ちする羽目になる。

・うろ覚えのメソッドを探すのにも、クラスリファレンスを攫わないとならなくなる。

などなど、いろいろ困った事態になるのですよ。

・・・ってか、initWithTitle:delegate:cancelButtonTitle:destructiveButtonTitle:otherButtonTitles:...なんて、いちいち手で打ってられっかっ!!!

 

この妙な現象、プロジェクトが小さかったり、サンプルレベルのコード組んでいる間は、発生しないんだな、嫌らしいことに。

プロジェクトが大きくなってくると、あるとき突然発生することがある。

そして、一度発生してしまうと、キャッシュのbuildフォルダを削除して再作成しようが、いっこうに直る気配がない。

 

そして本日、作業中のプロジェクトで、見事に再発してしまいました。

・・・が、今回は「仕方ねぇなあ・・・」とは言っていられない。というか、言いたくない。

何しろ、あと半月以上は、新しいコードを打ち込んでいかないとならないプロジェクトだし。

 

というわけで、時間を取って原因究明することにした。

そして、「おそらくこれらしい」という原因を発見したのでメモ。

 

まえから「動きが怪しい」とは思っていたが、やはりというか、プリコンパイルヘッダが原因でした。

プリコンパイルヘッダとは、プロジェクトを新規作成すると、コードツリーのなかにある Supporting Files グループに自動的に作成される (プロジェクト名)-Prefix.pch というファイルのことだ。

このファイルに、プロジェクト内の全体にわたって使用する定義やライブラリのヘッダファイルを入れておくと、特に各コードで明示しなくても自動リンクされるので、いろいろ便利なのだが。

ちなみに本来の目的は、「変更する予定がないコードなので事前に一括コンパイルしておくことで、プログラム修正中に行うコンパイルの速度を上げる」ためのファイルだ。文字通り、pre(事前)-compile。

 

このファイルに特定のヘッダを定義してしまうと、この現象が発生するらしい。

今回の場合は、以下の三つのヘッダを同時にインポートしていたのが原因らい。

#import <CoreImage/CoreImage.h>
#import <CoreGraphics/CoreGraphics.h>
#import <QuartzCore/QuartzCore.h>

 

このうち、CoreImage以外の二つをヘッダから削除してから、Clean&Buildしたら、あっさりとQuickHelpが復活しました。

CoreImage.hを見てみればわかるが、このヘッダファイルは CIImage を使用するために必要な複数のライブラリヘッダをまとめているだけ。

 

ということで、どうやらこの多重インポートをQuickHelpが利用するインタイムコンパイルでまともに解決できずに失敗していたのが原因くさい。

今回の教訓:QuickHelpがイカれた時は、プリコンパイルヘッダ内でインポートしているヘッダを見直してみるといい。かも。

Filed under: ,
« August 2019 »
August
SuMoTuWeThFrSa
123
45678910
11121314151617
18192021222324
25262728293031