이슈: SwiftUI @FocusState 사용시 MemoryLeak 발생.
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
를 가지고 있다.
각각의 TextField
는 focusedField
를 바인딩하여 focused를 관리하도록 되어있다.
이는 Apple의 공식문서의 내용과 동일하다.
ChildView
는 ParentView
에서 event를 받아 화면에 나타난다.
그 방식이 NavigationLink이던, Sheet이던 아무 상관없다.
문제는 ChildView
를 닫아 ParentView
로 돌아와도 @FocusState
의 잔재로 추정되는 메모리가 남아있다는 것이다.
몇번이고 ChildView
를 열었다가 닫으면 계속해서 누수가 발생한다.
아래 사진은 처음 ChildView
를 열고 닫았을 때 발생했던 MemoryLeak이다.
실제 focusedField
때문인지 확인해보기 위해서 해당 코드들을 지우고 다시 실행해보았다.
결과는 더이상 MemoryLeak가 발생하지 않는다.
focused(_:equals:)
를 없애면 해당 문제가 발생하지 않는데, 여기서 발생하는 문제 같다.
해결방법
못찾았다...
아직 내가 이해도나 실력이 부족해서인지, 실제 SwiftUI내에서 발생하는 문제인지 모르겠다...
이와 관련된 내용을 아무리 검색해보아도 나오지 않으니 답답할뿐이다.
그냥 FocusState를 이용하지 말고 ViewModel에 직접 Focus를 구분하는 방식의 로직을 만들어서 View랑 바인딩해야겠다...
Author And Source
이 문제에 관하여(이슈: SwiftUI @FocusState 사용시 MemoryLeak 발생.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mo_nireu/이슈-SwiftUI-FocusState-사용시-MemoryLeak-발생저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)