Tag Archives: Xcode

Xcode:とある fatal errorへの対応方法

0
Filed under Xcode, トラブルシューティング
Tagged as ,

さっきまでうまくビルドできていたのになぜかビルドできなくなった!修正したコードを戻してもビルドが失敗する!ということがままあります。
そういう状態のあるパターンの解決方法をメモしておきます。

fatal error – file X has been modified

今回紹介するのは、こんな感じのエラーのとき。
Xcode:とある fatal errorへの対応方法

fatal error: file ‘/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk/System/Library/Frameworks/UIKit.framework/Headers/UIView.h’ has been modified since the precompiled header ‘/Users/XXXX/Library/Developer/Xcode/DerivedData/TestApp-hogehogefugafugafoobar/Build/Intermediates/PrecompiledHeaders/TestApp-Prefix-hogehogefugafuga/TestApp-Prefix.pch.pch’ was built

ちょっとiOS SDKとかのライブラリヘッダを見ていたりしている時に、ひょんな拍子で上書き保存してしまったりしてしまい、ファイルのタイムスタンプを変更してしまった時になる症状です。
プリコンパイル済みのライブラリのバイナリよりヘッダーが新しいからおかしいよ!というエラーですね。
この場合、プリコンパイル済みのバイナリを削除することで解決します。
具体的な方法ですが、「下記のフォルダを削除し、再ビルド」です。

/Users/XXXX/Library/Developer/Xcode/DerivedData/ModuleCache

XXXXとしているところは自分のユーザー名だったりしますし、将来、場所は変わるかもしれませんが、前述のエラーの中にあるパスを頼りに探すとよいでしょう。

iOS8開発テクニック集 Xcode6編

iOS8開発テクニック集 Xcode6編

カテゴリ:Kindle版

発売日:2014-04-12



日経ソフトウエア 2015年 01月号 [雑誌]

日経ソフトウエア 2015年 01月号 [雑誌]

カテゴリ:Kindle版

発売日:2014-11-27



Xcode 6.1が怖い理由

0
Filed under Xcode
Tagged as ,

先週(10/17)の話ですが、Xcode 6.1でビルドしたアプリを申請しようとしたら、アップロード後、「非公開APIを利用している」との理由で審査待ちにすら入りませんでした。
Xcode 6.1 Non-Public API

iTunes Store operation failed
Your app contains non-public API usage. Please review the errors, correct them, and resubmit your application.
The app references non-public selectors in Payload/APP_NAME.app/APP_NAME allocBatch:withEntity:count, allocWithEntity:, fastIndexForKnownKey:, indexForkey:

もちろん、非公開APIは使っていません。
そもそもそれまでに何度か申請してリジェクトされていたプロジェクトなので、非公開APIが入ることはありません。
そこで調べてみたら、Xcode 6.1を使っていると発生することがあるとわかりました!

しかも、結論が、Xcode 6.0.1でビルドしてアップすると問題無い、という後ろ向きな解決策のみ。
Swiftの構文とかも若干変わっているので迷いましたが背に腹は代えられません。結局、Xcode 6.0.1でビルドできるようにコードを修正し、アップしたら問題なく通りました。。

問題のあるバージョン

ただ、その後、Appleのデベロッパーサイトを見ても、バージョンが上がらないので、特定の環境なのかな?と思っていたのですが、よく見ると、地味に、ビルド番号が上がっています。
Xcode 6. 1 (6A1052c)
私の問題が発生したアプリのバージョンは、Xcode 6.1 (6A1052c)ですが、今は、Xcode 6.1 (6A1052d)が、「Oct 20, 2014」付でアップされています。微妙に違うので、もしかしたらこの辺りの修正がなされたのかもしれませんし、別の修正なのかもしれません。


lldbでiOSの例外を克服

0
Filed under Xcode
Tagged as , , , ,

プログラミングにおいて例外が発生したときの対応はとても重要です。
しかし、iOS開発で例外が発生したとき、なんとなく例外が発生したコードの付近を眺めて原因を予測していたりしませんか?
iOSがOSレベルで発生させる例外はきちんと原因表示ができるので、次の手順を覚えておくと、デバッグが容易に、そして確実になります!

例外を発生させるコード

さて、例外発生時の対応を学ぶためにはまずは例外を発生させるコードが必要になります。
いちいちコードを書くのも面倒、という人のために、プロジェクトをまとめてGitHubにアップしておきました。その名も「GenerateException」というプロジェクトです。

とてもシンプルに、ボタンを押したら例外が発生する仕組みになっています。

例外発生時に止める

Xcodeでは、ブレイクポイントの設定の中にすべての例外発生時に止める事ができるオプションがあります。まずはこれを設定しましょう。
Xcode左側のペインに、ブレイクポイントナビゲーターを表示させます。
そして、左下にある[+]ボタンを押して出てくるメニューから「Add Exception Breakpoint」を選びます。
lldbでiOSの例外を克服 Xcode
これで「All Exceptions」というブレイクポイントが追加され、準備は完了です。
lldbでiOSの例外を克服 Xcode

例外の出す情報を見る

プロジェクトをダウンロードし、ブレイクポイントの設定が完了したらあとはデバッグ実行してください。
起動した画面にあるボタン『Generate Exception』を押すと例外が発生し、下図のような状態で止まると思います。
lldbでiOSの例外を克服 Xcode
ただ、現在は例外が発生し、その元となるコードで止まっている状態ですので原因がわかりません。
ここで例外の原因を調べる方法は次のような手順となります。
1. 例外の発生しているスタックフレームを選択する(左側のスタックの一番上の”0 objc_exception_throw”というところ)
2. デバッグエリアのコンソールを開き、”(lldb)” に続いて “po $eax” とタイプし、Enterを押します。

(lldb) po $eax

3. これで今回発生した例外の原因が表示されます。
lldbでiOSの例外を克服 Xcode
以上!

lldbでスタックフレームを見る

One More Thing,
lldbにはいろいろ便利な機能があり、”po hogehoge”というのが有名かと思いますが、次のコマンドで現在のスタックフレームの変数を一覧することができるのを最近知り便利に使っています!
lldbでiOSの例外を克服 Xcode

(lldb) frame variable

iOSアプリのドキュメントはOmniGraffleで解決!

0
Filed under Mac, 仕事ツール
Tagged as , , ,

先日、たまたま発見したのですが、XcodeのプロジェクトファイルをOmniGraffleで開くことが出来ます!
OmniGraffle
実は、たまたまファイルとアプリの関連付けがおかしく、意図せず開いてしまったので、開いている最中、なんでこんな関連付けになってしまったんだろー。と不思議に思っていました。

クラス図!

ですが、開いて驚いたのですが、OmniGraffleはxcodeprojファイルを開く機能をきちんと備えており、なんと、クラス図を作ってくれるのです!
OmniGraffle opens Xcode Project
もちろん、OmniGraffleのオブジェクトとして配置されているので、すべてを自由に編集可能です。
クラスの派生構造を階層構造として保持しているので、OmniGraffleの自由レイアウト機能にも対応しています!

使い道

使い道ですが、複雑化したプロジェクトのクラス構成を一覧するにはとても良いと思います。
もちろん、クラス図として使わなくても、画面遷移のメモを作るのとかにも下地としてあると便利ですよね。
※今どきドキュメントなんて書かない!という人もいるかと思いますが、個人的にはエンジニアだろうが作図くらいサクッと出来てあたりまえだと考えています。

OmniGraffle最新版でも!

ちなみに、私の環境は、OmniGraffle Pro 5.4.4です。
アップグレードでも$99.99する上に、特段困っていないので、バージョンを上げていませんが、最新版は6.xとなります。
OmniGraffle6のマニュアルは英語ですが、iBooksで無料で取得出来ます。

このマニュアルで調べた所、Pro版だけですが、どうやら問題なく使えるようで、Xcodeプロジェクトや.pbproj、.framework、さらには.nibファイルも開けるようです!

OmniGraffle、ヤバい!