이슈: SwiftUI @FocusState 사용시 MemoryLeak 발생.

3950 단어 swiftui이슈swiftui

ISSUE

SwiftUI를 이용한 프로젝트를 진행하고 있는데 이상한 점을 발견했다.

아래의 예시 코드를 보자.

struct ChildView: View {
    enum FocusedField {
        case firstField
        case secondField
    }
    @State private var firstText = ""
    @State private var secondText = ""
    @FocusState private var focusedField: FocusedField?
    
    var body: some View {
        TextField("test", text: $firstText)
            .focused($focusedField, equals: .firstField)
        
        TextField("test", text: $secondText)
            .focused($focusedField, equals: .secondField)
    }
}

지금 보이는 ChildView는 두개의 TextField를 가지고 있다.
각각의 TextFieldfocusedField를 바인딩하여 focused를 관리하도록 되어있다.
이는 Apple의 공식문서의 내용과 동일하다.

ChildViewParentView에서 event를 받아 화면에 나타난다.
그 방식이 NavigationLink이던, Sheet이던 아무 상관없다.

문제는 ChildView를 닫아 ParentView로 돌아와도 @FocusState의 잔재로 추정되는 메모리가 남아있다는 것이다.
몇번이고 ChildView를 열었다가 닫으면 계속해서 누수가 발생한다.
아래 사진은 처음 ChildView를 열고 닫았을 때 발생했던 MemoryLeak이다.

실제 focusedField 때문인지 확인해보기 위해서 해당 코드들을 지우고 다시 실행해보았다.
결과는 더이상 MemoryLeak가 발생하지 않는다.
focused(_:equals:)를 없애면 해당 문제가 발생하지 않는데, 여기서 발생하는 문제 같다.

해결방법

못찾았다...
아직 내가 이해도나 실력이 부족해서인지, 실제 SwiftUI내에서 발생하는 문제인지 모르겠다...
이와 관련된 내용을 아무리 검색해보아도 나오지 않으니 답답할뿐이다.
그냥 FocusState를 이용하지 말고 ViewModel에 직접 Focus를 구분하는 방식의 로직을 만들어서 View랑 바인딩해야겠다...

좋은 웹페이지 즐겨찾기