DerivedDataというものを知っているだろうか?
派生データと訳すもので、XcodeでBuildした時に作られる中間データなのだが、これがよく分からないエラーを発生させる。
キャッシュが残っていると大体悪さするので、Cleanしてデータをキレイにすれば大体が上手く挙動してくれるのだが、たまに原因不明のエラーが発生するときがある。
とあるアプリをXcode7で開いたのち、Xcode8で開きアプリの挙動を確認すると画面遷移の段階で落ちてしまう。
この段階で、「ッ!?」と頭がパニクるわけですが、原因探るために乗り出すわけです。
(何で!? 何でアプリ落ちるの!? 昨日まで普通に動いてたじゃん!! 何で落ちるのよ!! なんもコード書き換えたりしてないじゃん!!)←自分の心が訴えてること。
Xcodeにエラー文でてるので内容見ると、
・fatal error: unexpectedly found nil while unwrapping an Optional value
(致命的なエラー:オプション値をアンラッピングしている間に予期せずnilが見つかりました)
と出てるのだが、「はて? 何かやったけっか?」となった。
とりあえずググるが、「値がnilだから落ちる」ということだが、「そんなことは知っとるんじゃ!!」と心の中で怒るわけです。
更に探っていくと、「ストーリーボードに紐付けが行われてない」なる記述を見て、紐付けが行われてないから値がnilになってるとのこと。
「ああ、こういうことかー」と原因を見つけた自分は安心するわけだが、そう簡単に解決出来るわけなく、その後原因解決するまで半日使うことになるわけですが……。
とりあえず原因っぽいものを見つけた自分はひたすらストーリーボードの箇所を探ったりしてるわけですが、一向に見つからない。
デバッグ張ったりして、アプリの動作を追いかけていくわけだが、全く関係ない場所で落ちている。
デバッグした時にでる良くわからない文字の羅列の中身(いわゆるバイナリデータか?)を覗く方法もあるので、試してみたがよく分からずじまいであった。
2〜3時間ほど消費した後、「もしかしてストーリーボードの紐付けが原因じゃないのか……?」と思うようになった。
そもそも、アプリが昨日まで普通に動いてたのに何で今日になっていきなり落ちるわけなのかサッパリわからない。
「サーバーから取得してる情報に関しても、別に問題はなさそうだし……。なんだろう、何が原因なんだろう……」
うーん、うーんと心の中で葛藤しながらググってるととある情報に行き着いた。
それが「DerivedData」というもの。Buildするときに出来るデータのようで、Xcode7で出来たこの「中間データ」をXcode8が見に行ってそれが原因でクラッシュするよー、みたいな内容の記事(stack overflow)だった。
「もしやこれが原因か? そういえばXcode7で開いてXcode8で開いたのは今日だし……」
そう思いながら、Xcodeの左上にあるメニューの「Preferences」を押し、設定画面を開く。
そのまま「Locations」に移動して「DerivedData」の箇所にちっこい➝のマークがあるので、そこをクリック。そうすると、Finder画面が開き、「DerivedData」のフォルダー出してくれる。
あとは該当箇所を削除してCleanして、Buildすればーー
動いた。
画面遷移するときに落ちてたが、何事も問題なかったかのように動いたじゃねーか、と安堵した。
Xcode7でBuildするとその時に出来たキャッシュが悪さをするので、原因不明の時はこれを消せば上手くいくよーというお話ですが、中々こんなミスに出くわしたことがなかったので、その時はだいぶ焦りました^^;
自分はXcodeごとにそんなデータが作られるとは知らなかったもので……。
Xcode7はXcode7。Xcode8はXcode8で中間データが作られるとか本当にビックリしましたね……。
とりあえず原因探って、エラーないようであればDerivedDataが原因のときもあるので、消せば良い感じになるよという一例ですかね。
「大体Cleanすればキャッシュも消えると思ってたのに、違ったのね……」というお話でもありますが。
本当にXcode、まだまだ謎だらけです。公式、もっと読んでいかないとなー。
そんな感じです。