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() 메소드를 직접 호출해야 한다.