AI의 답은 아래와 같다.
"_controller와 같은 인스턴스 변수는 해당 State 객체가 메모리에서 완전히 사라질 때 함께 소멸됩니다.
따라서 개발자가 명시적으로 _controller = null;이라고 코드를 추가하지 않아도 Dart의 가비지 컬렉터가 알아서 메모리를 정리합니다."
권장되는 패턴
class _MyWidgetState extends State<MyWidget> {
TextEditingController _controller = TextEditingEditingController();
// ...
@override
void dispose() {
// 1. 리소스 정리 (필수)
_controller.dispose();
// 2. 부모의 dispose 호출 (필수)
super.dispose();
// 3. _controller = null; <-- 이 코드는 불필요합니다.
}
}
dispose() 메소드의 역할
개체 내부의 정리 작업을 수행하는 핵심 메소드이고, null 대입은 객체에 대한 참조를 끊는 작업이다.
예를 들어 TextEditingController은 내부적으로 플랫폼(Android/iOS)의 네이티브 위젯과 연결되어 있다.
dispose() 메소드를 호출해야 해당 객체가 점유하고 있던 시스템의 네이티브 리소스를 운영체제에 반환된다.
만약 dispose() 메소드를 호출하지 않으면
Dart 가비지 컬렉터가 객체 자체는 정리할 수 있어도,
그 객체가 물고 있던 네이티브 리소스 연결은 계속 살아남아 메모리 누수가 발생하고
해제되지 않은 컨트롤이나 리스너가 위젯이 사라진 후에도 계속 작동하려고 시도하여 오류가 발생할 수 있다.
그리고 null을 대입한다고 해서 객체의 dispose() 메소드가 자동으로 호출되지는 않는다.
super.dispose(); 호출전 사용했던 컨트롤러나 리스너의 .dispose() 메소드를 직접 호출해야 한다.