SwiftUIの子ビューのクロージャーSelf参照について
WWDC19にて発表されたSwiftUIのチュートリアルを試し中です。
Handling User InputのCreate a Favorite Button for Each Landmarkの項目でButton(action: {})
メソッドの引数のクロージャーにSelf
にアクセスしているところがありました。
Button(action: {
self.userData.landmarks[self.landmarkIndex]
.isFavorite.toggle()
}) {
if self.userData.landmarks[self.landmarkIndex]
.isFavorite {
Image(systemName: "star.fill")
.foregroundColor(Color.yellow)
} else {
Image(systemName: "star")
.foregroundColor(Color.gray)
}
}
ここのSelfはLandmarkDetailというビューです。
循環参照になり、メモリリークを起こすのではないかと思いWWDCのラボで質問したところこのような回答を得られました。
「このButtonは毎回生成され、Selfが保持することはない。Selfが保持していないので循環参照にならない」
なのでButtonのクロージャーでSelfにアクセスしても大丈夫とのことです。
次の図で説明すると今回は右側ということです。
SwiftUIのビューライフサイクルが気になりましたがとりあえず一つ疑問が解決してよかったです。
子ビューは毎回生成するんですかね?ReactJSみたいですね。