困った事の数々...
MacOSXの開発で遭遇した問題点やその解決策を紹介します。001.ブレークポイントを設定しデバッグしようとするとNSInvalidArgumentExceptionで落ちる
002.複数ファイル間での文字列検索が行えない???
003.NSArrayを使っているところでEXC_BAD_ACCESSで落ちる
004.ターゲット名を変更するとプログラムが落ちる???
005.NSMutableStringにinsertStringを行うとプログラムが落ちる???
006.日本語のコメントを入れるとコンパイルエラーとなる?
007."finish" not meaningful in theoutermost frameのエラーが出る
008.could not use precompiledheaderのコンパイルエラーが出る
009. 'xxxx' undeclaredのコンパイルエラーが出る
010.階層化されたクラスがコード・エンコードされない???
011.NSTableViewを使用している画面において「プログラムはシグナルを受信しました:"EXE_BAD_ACCESS"」が出力される
012.[NSCFArray objectAtIndex:]: xxx (3) beyond bounds (3)のエラーが出力されプログラムがストールする。
013.info.plistは正しいのに書類アイコンが白紙になってしまう???
このページにも載ってますよん(gcc版です)
ブレークポイントを設定してコンパイルするとNSInvalidArgumentExceptionで落ちる
[NSCFString appendString] nil string or other argumentというようなメッセージがウインドウ下に表示されます。 デバッカーがエラーを出力しているようですが、これはファイルのパスの中に日本語が含まれているためです。 私の場合ソースファイルのパスを全て英数時にし全コンパイルすることによって発生しなくなりました。複数ファイル間での文字列検索が行えない???
なんのことはないです。デバッカを開いたままコマンド+Fを押しただけでは複数ファイル検索ダイアログが開きません。 複数ファイル選択ダイアログを表示するためにはコマンド+F+シフトでオッケーです。メニューからも呼び出せますけどね。NSArrayを使っているところでEXC_BAD_ACCESSで落ちる
なんのことはありません。NSArrayの最後にnilを入れてなかったためでした。ターゲット名を変更するとプログラムが落ちる???
今のところ原因がわかっていません???NSMutableStringにinsertStringを行うとプログラムが落ちる???
NSMutableString は追加や削除ができるクラスであるとどんな本を読んでも書いてあるし。 ネットを探してもそれらしい答えが見つからない?。なんでだろ〜。 調べても調べてわからない。ところが、ふとコンソールを見てみると次ぎのようなエラーメッセージがException raised during posting of notification.Ignored. exception: Attempt to mutate immutable NSString with insertString:atIndex:
訳してみるとNSStringには文字列追加できまへ〜んって書いてあります。 NSMutableString なのに〜〜。とブツブツいいながらソースをよ〜くみてみると
wMStrB = [[NSString alloc] initWithData:Dataencoding:NSShiftJISStringEncoding];
値を挿入すると同時に領域を確保しているところでNSStringでアロケートしていたのです。 な〜んだこんな事か。継承って便利だけど、こんなんなったら気付かないな〜って思いました。 コンソールを見れば一発だったのかもしれませんけど。
教訓っ!
コンソールも確認しましょう〜
日 本語のコメントでコンパイルエラー
日本語のコメントを挿入したとたんに 「現在のエンコーディングでは処理できない文字を挿入しようとしています」と怒られてしまいます。
ここで「Unicodeに変換」を選んでしまうとコンパイルエラーが発生してしまいます。 環境の設定を正しくすればエラーにはならないんでしょうけど(笑)。 やり方がよくわかりませんでした。しかしっ!。 「UTF8に変換」を選択すれば問題なくコンパイルできます。 たったこれだけの事なのに1週間も悩んでしまいました(笑)。 現在のファイルのエンコーディングを調べるにはソースプログラムを選んでcommand+iで見る事ができます。
"finish" not meaningful のエラーが出る
奇妙なエラー("finish" not meaningful in the outermost frame)が出るのでネットなんかでいろいろと探したんですがなんだかよくわかりません。(直訳すると「最も外側の構造において意味がない終了」) なんとなく接続のような気がしたのでヘッダファイルをよくよく見ると接続していないアウトレットがありました。 それを接続してみたところあっさりエラーは出なくなりました。 結果からエラーメッセージを見て見るとなんとなくわかりますね。could not use precompiled headerのコンパイルエラーが出る
コンパイルすると以下のようなワーニングエラーが出力されてしまいます。warning:could not use precompiled header
'/System/Library/Frameworks/Carbon.framework/Headers/Carbon-gcc3.p',
because:/System/Library/Frameworks/QuickTime.framework/Headers/QuickTime.h:20:
warning:'AvailabilityMacros.h' has different date than in precomp
これについては本家アップルサイトに対処 法がありました。 ターミナルで次ぎのように入力する事でエラーにならないようにする事ができます。
> sudo fixPrecomps -force
また以下のコマンド形式でもオッケーのようです。
% sudo /usr/bin/fixPrecomps
プリコンパイルヘッダが古いので、作り直します。管理者のパスワードが必要です。
'xxxx' undeclaredのコンパイルエラーが出る
コンパイルすると以下のようなワーニングエラーが出力されてしまいます。'xxxx' undeclared (first use in this function) (Each undeclared identifier is reported only one for each function if appears in.) クラスを認識できない時に出るエラーですが、私の場合メソッドを呼び出す際にインスタンス名を使用せずにクラス名を使用していて発生しました。 インスタンス名を使用して呼び出すように修正するとよいかと思います。 同じメッセージですが別の問題でも遭遇しました。 上記の内容を何回確認してこのエラーメッセージが取れない時がありました。 その時はindexというクラスを作成してそのメソッドを呼び出そうとしたときです。 いろいろと悩んだあげくindexというクラス名を別名に変えることによってメッセージはでなくなりました。indexはどうも予約語のようです。
010. 階層化されたクラスがコード・エンコードされない???
クラスを階層化してファイルへの保存と読込みプログラムを作成していました。 その中でエンコードはできるんでせすけどエンコードしたファイルをデコードしようとするとシグナルが発生し デコードができない???。という現象が発生しました。なんのことやらちんぷんかんぷん。いろんな記事を読んでひたすら調べまくったのですが全然わからず。。。 この時たくさんワーニングエラーが出力されている状態だったのでまずはsudoコマンドなどを実行してエラーをとる事にしました。 そして残ったエラーをよくよく見てみると、「戻り値が指定設定されていない」というものがあって。。。 ずばりそのメソッドがデコードメソッド(- (id)initWithCoder:(NSCoder *)decoder)でした。 デコードメソッドに戻り値(return self;)を設定する事によって問題なくデコードできるようになりました。 なんと単純な原因でした。