【 -- バグ -- wikipedia 】
バグ (bug) とは英語で虫(成虫)の意であり、転じてコンピュータプログラムの製造(コーディング)上の誤りや欠陥を表す。
ソフトウェア・ハードウェア開発における契約文書など、法的な文書ではバグのことを「瑕疵」と記述する。原因や責任の所在などが不明なものを特定性の低い表現の「不具合」と呼ぶことがある。また、セキュリティ上に関わるバグや欠陥は「セキュリティホール」などと呼ばれることもある。
多くのバグが含まれ、機能的に正常な役割を果たさないものを、バギー・プログラム(buggy program)と呼ぶことがある。
なお、発生したバグを探して取り除く作業はデバッグと呼ばれる。
プログラマーの親愛なるお友達であるバグ君。
僕らにはいつもこいつがついている。。切っても切れない、、そう、まるで赤い糸につながれたような・・・
・・・今回もこいつに蹂躙されました^^
------------------------------------------------------------------------------------------------------------------------
まず出たのはXCodeで開発中に時たま頻繁に不定期的に日常茶飯事的にまぁまぁある、
mainの UIApplicationMain 関数で起きる
SIGABRT エラー (# ゚Д゚)
これが開発していて非常に厄介です。
『投げやりなことをせずに、せめてバグが起きている所でエラーを出して欲しい・・・ せめてもの慰めを!』
ということがあります。
XCodeでは救済処置として
エラーが起きたところに強制的に停止するブレークポイント機能が存在します。
そのやり方 ↓
はい、これで終わりです。
↓画像のように All Exceptions ( すべての例外 ) のブレークポイントが追加されました。
! AppDelegate の didFinishLaunchingWithOptions という関数内で勝手に止まってくれました。
で、ここなんですよ・・・
本日悩まされたエラーは(# ゚Д゚)
エラーで止まった
[ self.window makeKeyAndVisible ]
はウィンドウを作成し描画してくれるUIWindowの関数です。
なんでここで止まってんねん。 と。
まず思ったのは ViewController が正常に生成されていないのか。
しかし普通に生成されていますし、ちゃんとメモリをとったViewControllerを使っているのにもかかわらずエラーを吐き出します。
最初からプロジェクトを作成しなおしたり色々としてみた結果。。。
無理 (ヾノ・∀・`)
Googleニュースを観覧したり寿司打をしたり現実逃避をしていた時...
『あ、ログ....』 と思いまして慌ててエラーが出た時にXcodeのコンソールを見てみると。
いたぁ・・・( ;∀;)
自分の経験の無さに対して自責の念に駆られました。。
【 NSUnknownKeyException 】エラー。
ふむ... 見たこと無い(´・ω・`)
xib 上では xib で貼りつけた Viewの1つと、 SNSDialogueView クラスの mpScreenView と繋がっているが、
実際の SNSDialogueView クラスの中にmpScreenViewが存在しないので参照エラーを起こしている。
だそうです。
うわー・・・
心当たりあるわぁー・・・ めっちゃあるわー・・・
SNSDialogueViewクラスから mpScreenViewを消して別のクラスに書きなおした記憶あるわー・・・
と、いうことで xib上で参照の消し忘れがある。 ということらしいです(´・ω・`)
確かにこれはXCode王もエラー出すタイミングがわからんわ。。
なんでこうなったのか。
なんか知らないけど手順書く。(暇)
------------------------------------------------------------------------------------------
まず、xibを開く。 次にXCodeの右上にあるEditorの、洋服みたいなボタンを押す。
すると2画面になる。
左には xib、右にはViewを追加、保持するクラスを表示しておく。
xibで適当にViewを貼りつけた後、そのViewと変数をつなげる為に
貼りつけたViewの上で「Control」を押しながらクリック、するとピュー っと線が伸びるのでそれを右半分に表示してあるクラスまで持っていく。
今回はViewControllerにxibと繋がるView変数を追加する。
すると、↓ 画面。
Name を適当に設定し、 TypeはUIView、 storage は Strong で作成。
強い参照。 ARCにより追加された。
strong指定するといろんな所にその変数を渡した時、元々保持していたクラスが破棄されても1つでもこの変数を持ったクラスがある限り生き残り続ける。
weak -
こちらは弱い参照。
元々保持しているクラスがいなくなったら、他のクラスが保持していても これを指定した変数もメモリから抹消される。
基本はStrongで作成するほうがいいんじゃないだろうか。
よく調べてみる。
で、Connectを押すと勝手にプロパティ変数が作成される。
後は
.m の方で @synthesize を書けばこのクラスで使用可能になる。
で、今回ksな私めはこれを書いた後、、、
という風に消していていましたが、 xib の方はそのまま残していたのです。
これが散々たる悲劇を引き起こした・・・_| ̄|○
ちゃんと xib からも参照を消してやると無事通るようになりました。
みなさんもエラーはちょっとしたミスで起こることなので、
エラーが出ても焦らずに冷静に判断して・・・ 後はグーグル先生に聞きましょう。
全て教えてくれます。
終了!