두 클래스, Plant
및 Generator
이 있습니다. Generator
은 벡터를 만들고 notify()
을 통해 브로드 캐스트합니다 (Plant
). classdef는 다음과 같습니다. 내 질문에 아무런 의미가 없으므로 실제 데이터 생성 방법은 포함하지 않았습니다. 나는 Generator
인스턴스를 삭제 한 후 생성 처음으로, 그것은 내가 Generator
인스턴스를 만드는 두 번째까지 소멸자를 실행하지 않습니다 수신기가 관련된 경우 MATLAB - 개체 소멸자가 실행되지 않음
classdef Plant < handle
properties
Listener
end
methods
function ListenerCallback(obj, data)
#% Perform an operation on data
end
end
end
classdef Generator < handle
properties
plant
end
events
newSignal
end
methods
function obj = Generator(plant)
obj.plant = plant;
obj.plant.Listener = addlistener(obj, 'newSignal', ...
@(src, data) obj.plant.ListenerCallback(data));
end
function delete(obj)
delete(obj.plant.Listener);
disp('Generator instance deleted');
end
end
end
은 내가
Generator
소멸자 정말 이상한 행동 것으로 나타났습니다. 다음은 그 예입니다.
>> P = Plant
P =
Plant handle
Properties:
Listener: []
Methods, Events, Superclasses
>> G = Generator(P)
G =
Generator handle
Properties:
plant: [1x1 Plant]
Methods, Events, Superclasses
>> clear G #% DESTRUCTOR NOT CALLED??
>> G = Generator(P)
Generator instance deleted #% why is the destructor run now?
G =
Generator handle
Properties:
plant: [1x1 Plant]
Methods, Events, Superclasses
>> clear G
Generator instance deleted #% and why is the destructor run properly now?
언제든지 내 소멸자가 실행되는 것이 중요합니다. 여기서 무슨 일이 일어나고 있고, 소멸자가 제대로 작동하게하려면 어떻게해야합니까? (난 그냥 모두 리스너를 제거하고이 작동하지 않을 경우 직접 Generator
인스턴스에서 Plant.ListenerCallback()
를 호출 할 수 있습니다.)
편집 : 나는 clear G
을 수행 할 때, 변수 G
작업 공간에서 제거 될 것 같은데 -하지만 Generator
개체는 P.Listener.Source
에 있습니다. 이것이 소멸자가 호출되지 않는 이유입니다. 그래서 G
을 삭제하여 P.Listener
을 제거 할 수있는 방법이 없다고 생각합니다. 이걸 내가 원하는대로 할 수있는 방법이 있습니까? 아니면 그냥 붙어 있습니까?
'삭제 G; 'clear G'가 아닌'clear G' 만? 문서에서 "그림 또는 다른 객체의 핸들을 지울 수 있지만 객체 자체는 제거되지 않습니다. 객체 및 파일을 제거하려면 delete를 사용하십시오. 핸들." – tmpearce
@tmpearce - 작동하지 않습니다. 나는이 코드가 훨씬 더 큰 코드베이스의 일부이기 때문에'clear G' 만 사용하기를 희망했습니다. MATLAB을 사용하는 사람들과 함께 일하는 대부분의 사람들은'delete'와'clear' 사이에 차이점이 있는지 전혀 모릅니다. 그래서 이것은 매우 혼란 스러울 수 있습니다. –
네, 이해합니다. 소멸자에 문제가 없기 때문에이 정보로 질문을 업데이트하고 싶은 경우가 있습니다. 객체에 'clear'가 포함되어 있기 때문입니다. – tmpearce