Почему этот объект не уничтожается, когда он очищается от рабочего пространства? - PullRequest
0 голосов
/ 21 января 2020

Я работаю над классом MATLAB, который хранит интерфейсный объект, созданный с помощью tcpip, и включает функцию обратного вызова для использования интерфейсным объектом, как показано в следующем примере:

classdef wsg50_mini2 < handle

    properties
        TCPIP
    end

    %PUBLIC METHODS
    methods

        %CONSTRUCTOR
        function obj = wsg50_mini2(varargin)
            fprintf('################# I am created #################\n')

            obj.TCPIP = tcpip('localhost',1000);
            obj.TCPIP.OutputBufferSize = 3000;
            obj.TCPIP.InputBufferSize = 3000;
            obj.TCPIP.ByteOrder = 'littleEndian';
            obj.TCPIP.Timeout = 1;

            %Setting up Callbackfunction
            obj.TCPIP.BytesAvailableFcnMode = 'byte';
            obj.TCPIP.BytesAvailableFcnCount = 1;
            obj.TCPIP.BytesAvailableFcn = {@obj.TCP_Callback, obj};
        end
    end

    %PRIVATE METHODS
    methods (Access = private)

        %DESTRUCTOR
        function delete(obj)
            fprintf('################# Hey I am called! #################\n')
            instrreset
        end
    end

    %STATIC METHODS
    methods (Static)
        %TCP Callback
        %This function will be called if one Byte is available at the TCPIP
        %buffer.
        function TCP_Callback(tcpsocket,event,obj)
            fprintf('Loading 1 Byte Data From Buffer.\n')
        end
    end
end

Когда я очищаю В моем классе переменная будет очищена из рабочей области, но функция деструктора delete не вызывается. Почему нет?

Я понял, что мои Инструменты все еще активны в приложении Контроль инструментов. Если я удалю свои инструменты оттуда, мой деструктор delete будет вызван.

Я думаю, что это странное поведение класса tcpip.

1 Ответ

1 голос
/ 21 января 2020

Очень похоже на то, что у вас есть wsg50 ссылка на переменную в вашем классе Instrument Control App, в том случае, когда вы очищаете переменную из рабочей области, потому что на нее все еще ссылаются в другом месте, это не deleted.

Давайте рассмотрим простой пример:

classdef myClass < handle
  properties
    name = '';
  end
  methods
    function delete ( obj )
      fprintf ( '%s being deleted\n', obj.name );
    end
  end
end

Справа давайте запустим некоторый код:

var = basicClass;
var.name = '123';

Если мы очистим эту переменную, вы увидите delete называется:

>> clear var
 being deleted

Если мы повторно запустим этот код и сделаем ссылку в другом месте:

var = basicClass;
var.name = '123';
otherReference.var = var;

Если смотреть на обе переменные, они одинаковы (как и ожидалось):

>> var    
var = 
  myClass with properties:
    name: '123'

>> otherReference.var
ans = 
  myClass with properties:
    name: '123'

Так что же произойдет, если мы clear var и посмотрим на другую ссылку

clear var
otherReference.var.name

>> otherReference.var
ans = 
  myClass with properties:
    name: '123'

Мы можем видеть, что переменная класса жива, как и должно быть, поскольку это не имеет значения чем класс, являющийся входом для функции, и когда эта функция завершает работу, локальная копия этой переменной удаляется из области видимости.

Если мы действительно хотим удалить переменную, вы можете сделать следующее, когда вы явно запустите метод деструктора:

var = basicClass;
var.name = '123';
otherReference.var = var;
delete(var);
otherReference.var.name

Строка delete дает нам:

123 being deleted

Пока мы смотрим на otherReference.var, мы получаем:

Invalid or deleted object.

Это фактически удалит переменную, и вы увидите, что otherReference теперь указатель на инвалид ручка d.

...