Debug Memory Graphとは
Xcodeでは、参照関係を視覚的に確認することができ、Xcodeの Debug Memory Graph をクリックするとインスタンス間の参照関係を見ることができます。
Debug Memory Graphの表示方法
① command + R で、Xcodeの実行を行う!
②下記の画像の赤で囲んだボタンを押すと、Debug Memory Graphを表示することができる!
下記の画像のViewControllerの右上の...のボタンを押すと、参照関係の表示を指定できます!
クロージャのキャプチャを理解する!
クロージャのキャプチャとは
通常ローカルスコープで定義された変数や定数は、ローカルスコープ内でしか使用できない。
しかし、ローカルスコープ外の変数や定数であっても、クロージャ実行時に参照することができる。
これは、クロージャが自身が定義されたスコープの変数や定数への参照を保持することによって行われます!
この保持のことを「キャプチャ」という!
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インスタンスをキャプチャすることができる!
インスタンス間の参照関係を見てみよう!
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を使用することで、参照関係を視覚的に確認することができます!
参考文献