如果MyObj是classdef,我有一个数组
objs = [MyObj(), MyObj()];
然后如果我打电话
delete(objs);
正如我所料,调用了MyObj的delete方法。 如果MyObj是handle的子类,则为数组中的每个对象调用delete方法。但是,如果它不是句柄的子类,则看起来整个数组都传递给delete方法。但是,我在文档中找不到这种行为,而我可以在文档中找到句柄行为。
这真的是我所看到的正确解释吗?处理这个问题的正常做法是什么?只是从句子中继承,或者在delete方法中检查一个数组并依次删除每个元素?继承句柄是否有缺点(除了具有引用语义之外)?对于非处理案例,是否有必须考虑的案例?
答案 0 :(得分:3)
句柄类有一个名为delete
的析构函数方法。该方法由MATLAB隐式实现,但您可以自己重载它以实现自定义析构函数行为。
当需要销毁对象(不再在任何地方引用)或者可以由您显式调用时,MATLAB会隐式调用析构函数方法。它是为数组中的每个元素单独调用的(正如您所注意到的)。
值类没有析构函数方法。它们可能有一个名为delete
的方法,但它就像任何其他方法一样(特别是,当对象被销毁时不会隐式调用它,并且不会为数组中的每个对象单独调用它。)
要强调最后一点,请在问题中创建objs
,并使用值类数组。但是,不要明确地调用delete(objs)
,而是说objs = []
。您会注意到虽然对象已被销毁,但您的delete
方法根本没有被调用(因为尽管被称为delete
,但它不是析构函数,因为它来自值类)
我不知道如何回答你的问题“处理这个问题的正常做法是什么”。如果需要析构函数,则需要使用句柄类。我无法想象你想要使用具有值类的析构函数的情况。
您可以在documentation中阅读更多内容。