この記事では、一般的なバグ修正方法をいくつかご紹介します。
一般的なデバッグ手法
print, print, print...
Printステートメントは常に役に立ちます。それにより、プログラムのランタイム中に変数を出力できます。
func dailyRoutine(){
print(myCats)
myCats.forEach { (cat) in
print("猫の名前は\(cat.name)です。")
cat.feed()
cat.hug()
}
}
ブレークポイント
行番号をクリックしてブレークポイントを Xcode
に設定できます。プログラムは、シミュレーターか接続したiOSデバイス上で実行しているとき、ブレークポイントに到達すると停止します。ブレークポイントには以下のようないくつもの種類があります。
通常のブレークポイント
通常のブレークポイントを作成するには、Xcode
のコード行の行番号をクリックします:
プログラムが停止すると以下のようになります:
条件付きブレークポイント
条件付きブレークポイントは、ある特定の条件を満たした場合にのみコードを停止させます。例えば、ネコの名前が "ネコノヒー" : の場合にのみ、プログラムの実行を停止させたいならば
- 通常のブレークポイントの作成
- 青ラベルをダブルクリックする
- 条件フィールドに条件を入力する。ここでは
cat.name == "ネコノヒー"
と入力しました。
表示変数
ブレークポイントに来たらアクションを実行して、プログラムを停止しないこともできます。
print(cat.name)
上記コードは次のように置き替えることもできます。
- 通常のブレークポイントを作る
-
Add Action
ボタンをクリックする -
po cat.name
などのアクションを入力する。po
がどのようなものであるかについては、次のパートで取り上げます。 - トグルスイッチを、評価アクション後に自動的に継続するオプションに合わせる
Automatically continue after evaluating actions
ブレークポイントに来てもプログラムは停止せず、猫の名前がコンソールに表示されます。
Xcodeが組み込まれたランタイムデバッガ (po)
ブレークポイントでプログラムが停止した時は (通常のブレークポイント)、変数の値を調べて、変数値を変えて下さい。
例えばここにブレークポイントを置くことができます。
ブレークポイントでプログラムが停止した時は、コンソールウィンドウで命令を実行できます。
変数を調べることができます。
ここでは、po
は表示オブジェクトにあたります。
po myCats
po myCats.count
po myCats.first?.name
変数を変更することも可能です
po myCats.count //2
po myCats.append(.init())
po myCats.count //3
Xcode オーガナイザー
App Storeで既にプログラムが公開されていれば、Appleがクラッシュの情報を集めてくれます。
Xcode
のトップメニューで、"Window"と"Organizer"をクリックしてください。
左側でApp Storeで既に公開しているアプリケーションをクリックして、トップの"Crashes"をクリックしてください。
App Storeにある私のアプリで起きた実際のクラッシュに関するレポートをシェアしたいと思います。この問題はすでに解決済みです。
まずはバージョンのドロップダウンメニューをクリックしてバージョンを選択してください。
実際に起きたソフトウェアのクラッシュのリストが表示されるかと思います。そのうちの1つをクリックして詳細を見てください。
青色の "Open in Project" (プロジェクト内で開く) ボタンをクリックすると、自分のプロジェクトファイルを選択でき、どのラインでクラッシュがあったのかを教えてくれます。
Metrics
これまでの記事で話したように、メトリクスをチェックしてメモリに問題がないかどうかを確認することもお勧めします。
iOSアプリのメモリリーク (Memory Leak) の検出とデバッグの方法を、ネコに関するプログラムで学びましょう。(Reference Cycle 参照サイクル)