2011-08-29 10 views
9

클래스가 있다고 가정하면 myClass < handle입니다. Mathworks Help page on clear에서MATLAB - 'clear'를 사용할 때 객체 소멸자를 실행 하시겠습니까?

핸들 그래픽 핸들을 지우지 않아도 개체가 제거되지 않으며 개체를 삭제해도 핸들이 저장된 변수가 제거되지 않습니다. 내가 처음으로 명시 적으로 delete을 ..

내가 제대로 정리를하고 그것을 몇 가지 참조를 제거하는 myClass에 대한 소멸자를 지정하지 않는 한

hf = figure; % Creates figure object, stores handle in variable hf 
delete(hf) % Removes figure object, but not the variable hf 
clear hf  % Removes hf from the workspace; figure could still exist 

그래서 clear 핸들 객체를 보내고하는 것은 메모리에서 제거되지 않습니다; 이 소멸자는 clear에 호출되지 않습니다. 내 객체가 지워질 때 소멸자를 호출 할 수 있습니까?

편집 : 나는 myClass 객체에 대한 참조가없는 경우 delete가 자동으로 clear 호출하는 동안, 나는 다른 클래스를 가지고 myClass 참조 속성 myOtherClass 말을 언급해야, myOtherClass.a을 말한다. myOtherClass에는 속성이 myClass이 아니지만 myOtherClass.a도 비어 있으면 비어 있어야합니다. 그게 의미가 없다면 나에게 알려줘. 그건 너무 어리 석었을거야.

답변

10

핸들 클래스 개체에 대한 모든 참조를 지우면 메모리에서 제거되고 myClassdelete 메서드는 개체가 삭제 될 때 자동으로 호출됩니다. 불행한 혼란스러운 용어 일뿐입니다. myClass은 "MCOS 클래스"또는 "MCOS 객체"이며 help clear과 같은 "핸들 그래픽 객체"는 아닙니다. 그것들은 적어도 M 코드 레벨에서 다른 것들입니다.

핸들 그래픽 "objects"는 myClass와 동일한 "object"유형이 아니며 figure()이 반환하는 "handle graphics handle"은 handle 클래스와 동일한 종류가 아닙니다. 에서 상속. help clear에서 "handle graphics handles"에 대한 이야기는 여러분의 객체에 적용되지 않습니다. doc handle을 참조하고 관련 doco에 대한 delete 방법 링크를 따르십시오.

기분 나쁘게 생각하지 마십시오. Matlab doco는 이러한 구분을 명확하게하지 않습니다. (IIRC에서는 명시 적으로 "MCOS"라는 용어를 사용하지 않고 "객체"라고 부릅니다.) 기본적으로 문서의 "객체 지향 프로그래밍"섹션 아래의 자료는 "객체"의 종류와 관련이 있습니다. 너는 myClass으로 일하고있다. "Graphics"와 "GUI Development"아래의 doco는 "object"와 "handle"의 다른 핸들 그래픽 종류에 대해 이야기합니다. 나는 그들이 핸들 그래픽스에 대해 "handle"이라는 용어를 사용하고 OOP에 대해서는 "handle class"라고 생각한다.

delete이 작동하는지 확인하려면 간단한 수업을 만드십시오.

classdef myClass < handle 
    methods 
     function delete(obj) 
     disp('delete was called'); 
     end 
    end 
end 

그런 다음 하나를 만들고 지 웁니다.

>> x = myClass 
x = 
    myClass handle with no properties. 
    Methods, Events, Superclasses 
>> clear x 
delete was called 
>> 

소멸자가 호출되지 않으면 느린 개체에 대한 다른 참조가있을 수 있습니다. 객체에 대한 참조를 보유하는 변수가 지워질 때마다 소멸자가 호출되지 않고 참조 (또는 간접 참조)가있는 마지막 변수가 지워질 때만 소멸자가 호출됩니다.

+0

느린 개체에 대한 다른 참조가 확실히 있습니다. 내가 소멸자에서 참조를 없애기 때문에이 기능을 사용하고자하는 이유 중 일부입니다. 관련 정보로 OP를 업데이트했습니다. 완전한 컨텍스트 없이는 의미가 없을 수도 있지만 전체 컨텍스트는 특히 질문과 관련이 없습니다. –

+0

특히 사용자 지정 GUI 요소를 만들 때 비슷한 문제가있었습니다. 변수를 지울 때 소멸자가 호출되도록 할 수 있다고 생각하지 않습니다. 귀하의 질문에, 당신은 단순히 지우기 전에 개체에 delete 메서드를 호출 할 수 있습니다. – hoogamaphone

+0

참고로, 소멸자가 명확하게 호출되지 않는 좋은 기능은 객체 지향 코드가있는 gui를 사용할 때 터미널에서 사용된다고 생각합니다. 즉, 사용자가 실수로 'clear'를 사용하면 gui에 대한 핸들이 작업 영역에서 지워지더라도 GUI가 종료되지 않습니다. 그러나 사용자가 핸들에서'delete'를 호출하면 소멸자는 여전히 실행됩니다. – Justin