コード追跡に役立つ Xcode の機能

## ファイルを探す

### 名前を入力して開く

* File > Open Quickly...

ファイル名(クラス名)だけでなく、メソッド名や変数名でも検索できる。

> 入力後Option+Enterキーでファイルを開くと、Assistant Editor側にファイルを開いてくれます。
> (Standard Editorの状態でも、Assistant Editorのモードに切り替えた上で開いてくれる！)

### クラス名の一覧から開く

* View > Navigators > Show Symbol Navigator

## エディタの機能

なるべくショートカットを覚えて活用したい。
自分はデフォルトのキーアサインが気に入らなかったので、Control + 何か にカスタマイズしている。

### クラスやメソッドの定義にジャンプ

* クラス名やメソッド名にカーソルを合わせる。
* Navigate > Jump to Definition

### ジャンプ前のソースに戻る・進む

* Navigate > Go Back / Forward

### 次・前のエラーにジャンプ

* Navigate > Jump to Next/Previous Issue

### ヘッダ(.h)と実装ファイル(.m)を切り替える

* Navigate > Jump to Next/Previous Counterpart

### メソッドの呼び出し元を表示する

* メソッドにカーソルを合わせ、右クリック
* コンテキストメニューから `Find Call Hierarchy` を選択

画面右の `Find navigator` に、呼び出し元のツリーが表示される

#### その他の方法

* メソッドにカーソルを合わせる。
* View > Standard Editor > Show Related Items
* 表示されるメニューから Callers > (呼び出し元メソッド) を選択。

または Assistant editor を開き、表示するコードを "Callers" に変更。
あとは左のエディタでメソッドにカーソルを合わせることで、自動的に呼び出し元のコードが表示される。
(呼び出し元が複数ある場合は最初を表示)

### カーソル下にある型やプロパティのヘルプを見る

* Help > Show Quick Help for Selected Item (Command+Control+?)
* デフォルトショートカットがすごく入力しにくいので、適宜変更すると良さげ

### カーソル下にある型やプロパティに対するアクションリストを表示する

* Xcode 10: Editor > Selection > Select Structure (Command+Shift+A)
* Xcode 11: Editor > Show Code Actions (Command+Shift+A)

<img width="290" alt="スクリーンショット 2019-08-30 19.43.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/d0cbce40-453d-1a20-c9af-c35717559282.png">


### 検索あれこれ

* Find > Find... (Command+F)
* 検索キーワードを入力
    * Find Next: 次にマッチする場所へジャンプ (Enter または Command+G)
    * Find Previous: 前にマッチする場所へジャンプ (Shift+Enter または Command+Shift+G)
    * 検索を終了 (Esc)

> Find Next(Command+G)、Find Previous(Command+Shift+G)は検索モードでなくても、最後に入力した検索キーワードで再検索を行ってくれる。

### Assistant Editor / Primary Editorで開く

* Navigate > Open in Assistant/Primary Editor

Primary Editorで開いているファイルをAssistant Editor側に置いて別のファイルを開きたいときや、その逆を行いたいときに便利。

### Project Navigatorからファイルを開くとき、エディタを選択する (Xcode 11)

Project Navigator内のファイルをCommand+Shift+Option+クリックすると、どのエディタで開くかを選択できる。

> Preferences > Navigation タブの　Optional Navigation を `Uses Destination Chooser` に設定しておくと、 Option+クリックだけで同様の動作になる

<img width="912" alt="スクリーンショット 2019-08-30 19.58.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/140d0c19-00df-55ba-cdb1-d2a059011f4b.png">

### 複数開いているエディタを横断する

* Navigate > Move Focus To Next Editor

Assistant Editorなどで複数エディタを開いているときに便利なので、ショートカットを活用したい。

### 現在のエディタを最大化する/元に戻す (Xcode 11)

複数のエディタを分割して使用しているとき、一時的に1つのエディタを最大化したいときに便利。

* View > Editor > Focus / Hide Focus (Command+Shift+Control+Enter)

### Source Editor上部にあるメニューを開く

* View > Standard Editor > Show Document Items (Control+6)

<img width="830" alt="xcode_20160701.png" src="https://qiita-image-store.s3.amazonaws.com/0/25727/58b1f35f-7e52-f1ba-537c-9aea6dd83862.png">

この状態で文字をタイプすると、候補の絞り込みが行える。

<img width="833" alt="xcode_20160701_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/25727/b2f8f48c-b767-d49f-6a09-ad1e5dc18855.png">

上下キーで候補を選択し、Enterキーで確定すれば、その位置にジャンプする。

### 選択中のテキストと同じ部分をまとめて変更する

対象部分を選択した状態で、

<img width="950" alt="xcode_20160701_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/25727/3b29b118-715d-bc2b-8522-d8028c07b302.png">

* Editor > Edit All in Scope (Command+Control+E)

そのままタイプすれば、同じテキストがまとめて変更できる。

<img width="861" alt="xcode_20160701_4.png" src="https://qiita-image-store.s3.amazonaws.com/0/25727/88b67cca-6418-203b-a6f0-25bef520fdf5.png">

### ドキュメントテンプレートを挿入する (Xcode8)

従来VVDocumenter等のプラグインで実現していたドキュメントテンプレートの挿入機能は、Xcode8より以下のコマンドでできるように。

* Editor > Structure > Add Documentation (Command+Option+/)

## デバッガ

### 例外ブレイクポイント

デバッグ実行中に例外が発生したとき、発生した場所でプログラムが停止する。

* Breakpoint Navigator を開く。
* 左下にある＋ボタンをクリックして Add Exception Breakpoint

発生した例外の内容を知りたい場合はデバッグコンソールで以下のいずれかを入力する。

* po $r0 (arm : iPhone/iPad 実機)
* po $rax (x86_64 : OSX, iOS シミュレータ)
* po $eax (i386 : OSX, iOS シミュレータ)

上記のコマンドをブレイクポイントのアクションに入れておけば、停止時に自動で出力される。

![excbreak-log.png](https://qiita-image-store.s3.amazonaws.com/0/25727/d0e24a05-f99b-c7b2-cac0-2b511e4b9326.png)

[参考] http://stackoverflow.com/questions/15155495/how-do-i-get-exception-details-in-xcode-4-6

## コマンドライン

### バイナリに含まれているアーキテクチャを調べる

ビルドしたアプリケーションやサードパーティ製ライブラリに含まれているアーキテクチャを調べる場合は、以下のコマンドで。

```
$ xcrun lipo -info (バイナリファイルのパス)
```

## おまけ: ショートカット一覧を見る

[CheatSheet](https://www.mediaatelier.com/CheatSheet/)というアプリを使うことで、Xcodeでも何でも `Command` キー長押しでショートカットの一覧を見ることができる。

![スクリーンショット 2022-01-16 9.51.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25727/c6f4d7f0-064e-d80c-e53e-432afc49228e.png)