Swift Academy · レッスン

保持サイクル:原因と検出

Instrumentsを使い、オブジェクト間やクロージャとの間にある保持サイクルを特定します。

レッスン 2/412 ステップ

「保持サイクル:原因と検出」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

ようこそ

参照サイクルは、2 つ以上のオブジェクトが互いに強い参照を保持し、ARC のカウントが決して 0 にならない状態です。その結果、メモリリークが発生します。

単純な 2 オブジェクト間のサイクル

```swift class Owner { var pet: Pet? } class Pet { var owner: Owner? } var o: Owner? = Owner() var p: Pet? = Pet() o?.pet = p // Owner → Pet (strong) p?.owner = o // Pet → Owner (strong) o = nil; p = nil // Neither deinit called — cycle! ```

親子間のサイクル

```swift class Node { var children: [Node] = [] var parent: Node? // strong → cycle with parent } let root = Node() let child = Node() root.children.append(child) child.parent = root // cycle ```

クロージャキャプチャによるサイクル

```swift class ViewController { var onComplete: (() -> Void)? func setup() { onComplete = { // closure strongly captures self self.doWork() // ← cycle! } } } ```

デリゲートパターンによるサイクル

```swift protocol TaskDelegate: AnyObject { func didFinish() } class Task { var delegate: TaskDelegate? // if strong → potential cycle } class Manager: TaskDelegate { var task = Task() init() { task.delegate = self } // Manager → Task → Manager } ```

Instruments で検出する

Xcode Instruments の Leaks を使います: 1. Instruments でアプリを実行します 2. Leaks instrument をクリックします 3. 赤いマークはリークしたオブジェクトを示します 4. 詳細を確認して参照グラフを表示します 別の方法として、`deinit { print(...) }` を設定し、それが実行されるか確認することもできます。

Xcode Memory Graph で検出する

Xcode デバッガーで Debug > Memory Graph Debugger を選択します。リークしたオブジェクトをクリックすると参照チェーンを確認できます。グラフ上では、サイクルが閉じたループとして表示されます。

よくあるサイクルパターン

• デリゲートがデリゲートを強く保持する • クロージャが `self` を強くキャプチャする • 親と子が双方向に強い参照を保持する • NotificationCenter のオブザーバーが、self をキャプチャするクロージャを保持する • Timer のターゲットが `self` である(強い参照)

Timer の参照サイクル

```swift class Poller { var timer: Timer? func start() { timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] _ in self?.poll() // weak self breaks cycle } } deinit { timer?.invalidate() } } ```

NotificationCenterの循環参照

```swift class Listener { var token: NSObjectProtocol? init() { token = NotificationCenter.default.addObserver(forName: .UIApplicationDidBecomeActive, object: nil, queue: .main) { [weak self] _ in self?.refresh() } } deinit { NotificationCenter.default.removeObserver(token!) } } ```

理解度チェック

ARCにおける循環参照とは何ですか?

まとめ

重要なポイント: • 循環参照:互いに強参照すると、どちらも解放されません • よくある箇所:delegate、クロージャ、親子間の双方向リンク • InstrumentsのLeaksまたはXcode Memory Graph Debuggerで検出できます • `weak`または`unowned`参照で解消します • TimerとNotificationCenterも循環参照の原因になります — `[weak self]`で断ち切ります 次は、weak参照とunowned参照です。
無料で開始

AI チューターと学ぶ Swift — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
122
レッスン
409

よくある質問

「保持サイクル:原因と検出」レッスンは無料ですか?

はい。「保持サイクル:原因と検出」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「保持サイクル:原因と検出」で何を学びますか?

Instrumentsを使い、オブジェクト間やクロージャとの間にある保持サイクルを特定します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「保持サイクル:原因と検出」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ARCが参照を数える仕組み
  2. 保持サイクル:原因と検出
  3. weakとunownedの参照
  4. クロージャのキャプチャリストと[weak self]
← Swift Academyに戻る