2013-03-29 1 views
3

gtk bin 컨트롤이 있는데 제거하고 싶습니다. 즉, 창 에서뿐만 아니라 운영 메모리에서도 제거해야합니다. window.Remove (child_item)를 호출하여 창에서 제거하고 있지만 Destroy() 또는 Dispose()를 호출해야합니까? 아니면 둘 다 호출해야합니까? 어떤 순서로?Gtk.Bin.Destroy()와 Gtk.Bin.Dispose()의 차이점

답변

2

Dispose()는 GObject의 일부이며 참조를 해제하고 신호 처리기를 분리하기 위해 인스턴스 마무리 시퀀스 중에 사용됩니다. 참조 사이클의 경우에는 여러 번 호출 될 수 있으므로 설정되지 않은 필드를 확인하는 것이 좋습니다.

Destroy()는 GtkWidget의 일부이며 Dispose() 구현과 비슷한 용도로 사용됩니다. Destroy()는 GObject이 GTib의 내부 유형으로 시작하기 전에 (나머지 유형 시스템과 함께) GLib로 이동하기 전에 실제로 역사적으로 유물입니다. Destroy()는 GtkWidget 안에 Dispose()의 기본 구현의 일부로 호출됩니다.

컨테이너에서 자식을 제거하려면 컨테이너에서 Remove (자식)를 호출하거나 자식에서 Destroy()를 호출하면됩니다. Remove()는 자식에 대한 참조를 해제하여 그것이 마지막 참조라면 위젯을 파괴하는 것입니다. GtkWidget에있는 Destroy()를 호출하면 상위 컨테이너에서 위젯이 제거됩니다. 두 코드 경로는 서로 바꿔야합니다.

호출 Dispose()는 Gtk # -ism입니다. Dispose() 메서드는 대부분 재정의되고 직접 호출되지 않습니다.

+1

마지막 단락을 명확하게 설명해 주시겠습니까? "Gtk # -ism"은 Gtk #을 사용할 때 꼭해야만하는 것처럼 들리지만 문장의 나머지 부분은 Gtk #가 수행되지 않아야 함을 의미합니까? 또한, 오버라이드 된 메소드가 호출되지 않아야하는 이유는 무엇입니까? 그리고 위의 상태에서'Dispose()'가 자동적으로'Destroy()'를 호출하면 (다른 방법은 아닙니다!)'Destroy()보다는 직접적으로 호출되어야하는'Dispose)', 무엇이라도 있으면? –