iOS, Swift

SwiftUIの子ビューのクロージャーSelf参照について

WWDC19にて発表されたSwiftUIのチュートリアルを試し中です。

Handling User InputCreate a Favorite Button for Each Landmarkの項目でButton(action: {}) メソッドの引数のクロージャーにSelfにアクセスしているところがありました。

URL
https://developer.apple.com/tutorials/swiftui/handling-user-input#create-a-favorite-button-for-each-landmark


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にアクセスしても大丈夫とのことです。

次の図で説明すると今回は右側ということです。

IMG_0288-1

SwiftUIのビューライフサイクルが気になりましたがとりあえず一つ疑問が解決してよかったです。
子ビューは毎回生成するんですかね?ReactJSみたいですね。

Author image

About Sato Takeshi

  • Tokyo, Japan