
func getData() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 10, execute: { [weak self] in
            // LOGN DATA DOWNLOADING
            self?.data = "NEW DATA"
        })
    }
weak self를 선언, 현재 담당 self가 nil이 될 수도 있기 때문에 이후 참조 카운팅을 할 때 자동으로 사라짐
import SwiftUI
struct WeakSelfBootCamp: View {
    @AppStorage("count") var count: Int?
    init() {
        count = 0
    }
    
    var body: some View {
        NavigationView {
            NavigationLink("Navigate", destination: WeakSelfSecondScreen())
                .navigationTitle("Screen 1")
        }
        .overlay(
            Text("\(count ?? 0)")
                .font(.largeTitle)
                .padding()
                .background(Color.green.cornerRadius(10))
            , alignment: .topTrailing
        )
    }
}
struct WeakSelfSecondScreen: View {
    @StateObject private var viewModel = WeakSelfSecondScreenViewModel()
    var body: some View {
        Text("Second View")
            .font(.largeTitle)
            .foregroundColor(.red)
        if let data = viewModel.data {
            Text(data)
        }
    }
}
class WeakSelfSecondScreenViewModel: ObservableObject {
    @Published var data: String? = nil
    
    init() {
        print("INIT")
        let curCount = UserDefaults.standard.integer(forKey: "count")
        UserDefaults.standard.set(curCount + 1, forKey: "count")
        getData()
    }
    
    func getData() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 10, execute: { [weak self] in
            // LOGN DATA DOWNLOADING
            self?.data = "NEW DATA"
        })
    }
    
    deinit {
        print("DEINIT")
        let curCount = UserDefaults.standard.integer(forKey: "count")
        UserDefaults.standard.set(curCount - 1, forKey: "count")
    }
}
WeakSelfSecondScreen으로 네비게이션 이동할 때마다 WeakSelfSecondScreenViewModel을 초기화 생성, 데이터를 패치하는 이니셜라이저 구현getData) 메소드를 호출하기 때문에 어느 정도의 시간이 걸리지 알 수 없음self가 nil이 될 경우 참조 카운팅을 하지 않겠다는 표시를 통해 해결강한 참조

약한 참조
