環境
- Xcode 16.2
- iOS 18.2
概要
下記のコードは、ネスト構造のNestedView
内でNavigationLink
を使用し、同じNestedView
を再び表示するものとなっております。
最小限のViewModelと、@Environmentのdismiss
が定義されていることが特徴ですが、こちらのコードがシミュレータ上でフリーズを引き起こし、メモリ使用量がみるみる上昇していくという挙動に遭遇しました。
例外が発生しないので発生箇所の特定が難しかったです。
import SwiftUI
struct ContentView: View {
var body: some View {
NestedView()
}
}
struct NestedView: View {
@Environment(\.dismiss) private var dismiss
@State var viewModel: NestedViewModel
init() {
_viewModel = State(initialValue: NestedViewModel())
}
var body: some View {
NavigationStack {
NavigationLink {
NestedView()
} label: {
Text(viewModel.str)
}
}
}
}
@Observable
class NestedViewModel {
var str = "Hello"
}
#Preview {
ContentView()
}
解決策
@Environment(\.presentationMode)
を使用する
己の力で調べましたが、根本的な原因はわかりませんでした。
しかし、@Environment(\.dismiss) private var dismiss
を削除するとこの問題は発生しなくなりました。
そこで代わりに@Environment(\.presentationMode) private var presentationMode
経由でdismissを呼び出すことでことなきを得ました。
この件について何か心当たりがある方、教えてください ><
あとがき
例外ではない謎の無限ループでシミュレータがフリーズしたときは@Environmentを疑った方がいいかもですね…