LoginSignup
9
6

XcodeのDebug Memory Graphを使用して参照関係を理解しよう!~クロージャのキャプチャ~

Last updated at Posted at 2023-12-07

Debug Memory Graphとは

Xcodeでは、参照関係を視覚的に確認することができ、Xcodeの Debug Memory Graph をクリックするとインスタンス間の参照関係を見ることができます。

Debug Memory Graphの表示方法

① command + R で、Xcodeの実行を行う!
②下記の画像の赤で囲んだボタンを押すと、Debug Memory Graphを表示することができる!
下記の画像のViewControllerの右上の...のボタンを押すと、参照関係の表示を指定できます!

クロージャのキャプチャを理解する!

クロージャのキャプチャとは

通常ローカルスコープで定義された変数や定数は、ローカルスコープ内でしか使用できない。
しかし、ローカルスコープ外の変数や定数であっても、クロージャ実行時に参照することができる。
これは、クロージャが自身が定義されたスコープの変数や定数への参照を保持することによって行われます!
この保持のことを「キャプチャ」という!

ViewController.swift

import UIKit

class C {}
class D {}

class ViewController: UIViewController {
    var closure: () -> Void = {}

    override func viewDidLoad() {
        super.viewDidLoad()
        let c = C()
        let d = D()
        closure = { print(c,d) }
        closure()
    }
}

上記のコードをDebug Memory Graphで見てみると、下の画像のような参照関係になる!
クロージャが自身が定義されたスコープの変数や定数への参照を保持している!
この場合の自身が定義されたスコープとはviewDidLoad()のスコープを指している!
そのため、クロージャーがCインスタンスとDインスタンスをキャプチャすることができる!

インスタンス間の参照関係を見てみよう!

ViewController.swift
import UIKit

class C {}
class D {}

class ViewController: UIViewController {
    var closure1: () -> Void = {}
    var closure2: () -> Void = {}

    override func viewDidLoad() {
        super.viewDidLoad()

        let c = C()
        let d = D()
        closure1 = { print(c,d) }
        closure2 = { print(c,d) }
        closure1()
        closure2()
    }
}

下記の画像のDebug Memory GraphのCをクリックすると同じ色になります!
これは同じCインスタンスを参照しているということです!
このようにXcodeのDebug Memory Graphを使用することで、参照関係を視覚的に確認することができます!

参考文献

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6