2011-08-29 19 views
9

Giả sử tôi có một lớp học myClass < handle. Từ số Mathworks Help page on clear,MATLAB - chạy đối tượng destructor khi sử dụng 'rõ ràng'?

Xử lý đồ họa xóa xử lý không tự xóa đối tượng và cũng không xóa các đối tượng xóa biến lưu trữ tay cầm của chúng.

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 

Vì vậy clear ing một đối tượng xử lý không loại bỏ nó khỏi bộ nhớ, trừ khi tôi dứt khoát delete nó lần đầu tiên ..

tôi đã chỉ định một destructor cho myClass để làm sạch phù hợp và loại bỏ một số tài liệu tham khảo để nó; destructor này không được gọi là clear. Có thể gọi đó là destructor khi đối tượng của tôi bị xóa?

EDIT: Tôi nên đề cập rằng trong khi delete được tự động gọi với một clear nếu không có tham chiếu đến đối tượng myClass, tôi có một lớp khác, nói myOtherClass với thuộc tính tham khảo myClass, nói myOtherClass.a. Ngoài ra còn có các thuộc tính khác trong myOtherClass không thuộc tính của myClass, nhưng chúng sẽ trống nếu myOtherClass.a cũng trống. Hãy cho tôi biết nếu điều đó không có ý nghĩa, điều đó có thể hơi quá dài dòng.

Trả lời

10

Xóa tất cả các tham chiếu đến đối tượng lớp xử lý sẽ xóa đối tượng khỏi bộ nhớ và phương thức delete trên myClass của bạn sẽ tự động được gọi khi đối tượng đó bị hủy. Nó chỉ là thuật ngữ khó hiểu. myClass của bạn là "lớp MCOS" hoặc "đối tượng MCOS", không phải là "đối tượng đồ họa xử lý" như help clear đang nói đến. Chúng là những thứ khác nhau, ít nhất là ở cấp độ M-code.

Đồ họa xử lý "đối tượng" không phải là cùng một loại "đối tượng" mà myClass của bạn và "xử lý đồ họa xử lý" được trả về bởi figure() không giống với loại có tên là handle mà bạn kế thừa từ. Đoạn văn đó từ help clear nói về "xử lý xử lý đồ họa" không áp dụng cho đối tượng của bạn. Xem doc handle và đi theo liên kết cho phương thức delete cho tài liệu có liên quan.

Đừng cảm thấy xấu; tài liệu Matlab không làm cho những khác biệt này rất rõ ràng. (IIRC nó thậm chí không sử dụng một cách rõ ràng thuật ngữ "MCOS"; nó chỉ gọi chúng là "đối tượng".) Về cơ bản, tài liệu trong phần "Lập trình hướng đối tượng" trong doco có liên quan đến loại "đối tượng" và "xử lý" bạn đang làm việc với myClass. Tài liệu dưới "Đồ họa" và "Phát triển GUI" đang nói về loại đồ họa xử lý khác của "đối tượng" và "xử lý". Tôi nghĩ rằng họ sử dụng thuật ngữ "xử lý" cho các công cụ đồ họa xử lý và "xử lý lớp" cho các công cụ OOP.

Để xác minh rằng các công trình delete của bạn hoạt động, chỉ cần tạo một lớp tầm thường.

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

Sau đó tạo và xóa nó.

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

Nếu destructor của bạn không được gọi, có thể có các tham chiếu khác cho đối tượng kéo dài. Trình hủy không được gọi mỗi khi một biến giữ một tham chiếu đến đối tượng sẽ bị xóa, chỉ khi biến cuối cùng chứa tham chiếu (hoặc tham chiếu gián tiếp) bị xóa.

+0

Chắc chắn có các tham chiếu khác cho đối tượng kéo dài; một phần lý do tôi muốn chức năng này là bởi vì tôi loại bỏ các tham chiếu đó trong trình phá hủy của tôi. Tôi đã cập nhật OP với thông tin liên quan; nó có thể không có ý nghĩa nếu không có bối cảnh hoàn chỉnh, nhưng ngữ cảnh hoàn chỉnh không liên quan đến câu hỏi cụ thể .. –

+0

Tôi đã có các vấn đề tương tự, đặc biệt khi tạo các phần tử GUI tùy chỉnh. Tôi không nghĩ rằng nó có thể buộc các destructor được gọi là khi bạn xóa các biến. Khi bạn lưu ý trong câu hỏi của mình, bạn có thể chỉ cần gọi phương thức xóa trên đối tượng của mình trước khi xóa nó. – hoogamaphone

+0

Chỉ cần FYI, tôi nghĩ rằng đó là chức năng tốt mà destructor không được gọi là rõ ràng được sử dụng trong thiết bị đầu cuối khi sử dụng một gui với mã hướng đối tượng (mà tôi đã chủ yếu được tìm thấy là trường hợp). Điều này có nghĩa rằng nếu người dùng sử dụng 'clear' do tai nạn, gui của bạn sẽ không tắt máy, ngay cả khi tay cầm gui bị xóa khỏi vùng làm việc. Tuy nhiên, nếu người dùng gọi 'delete' trên tay cầm thì destructor sẽ vẫn chạy. – Justin