2012-03-14 17 views
5

Chúc ngày vui vẻ! Hàm GetService tạo ra cá thể của lớp THTTPRIO và trả về nó là IInvokable. Tôi sử dụng giao diện/đối tượng này trong một hàm khác. Tôi có phải giải phóng nó hay không khi tôi không cần nó nữa? Giao diện không cần phải được giải phóng nhưng tôi nhầm lẫn với thực tế là RIO được tạo ra như là đối tượng của lớp THTTPRIO.Đây có phải là một đối tượng hoặc một giao diện không? Tôi có cần phải giải phóng nó hay không?

function GetService(Addr: string): IInvokable; 
var 
    RIO: THTTPRIO; 
begin 
    RIO := THTTPRIO.Create(nil) 
    RIO.URL := Addr; 
    Result := (RIO as IInvokable); 
end; 

đâu:

IInvokable = interface(IInterface); 
THTTPRIO = class(TComponent, IInterface, IRIOAccess); 

Cảm ơn bạn trước! Vojtech

Trả lời

6

Để trả lời câu hỏi bạn cần kiểm tra cách IInterface._AddRefIInterface._Release được triển khai cho lớp này. Chúng trông giống như sau:

function TRIO._AddRef: Integer; 
begin 
    Result := TInterlocked.Increment(FRefCount); 
end; 

function TRIO._Release: Integer; 
begin 
    Result := TInterlocked.Decrement(FRefCount); 
    if (Result = 0) and not (Owner is TComponent) then 
    Destroy; 
end; 

Điều này có nghĩa là tuổi thọ của đối tượng được quản lý bằng cách tính tham chiếu giao diện. Điều đó có nghĩa là mã của bạn là chính xác và không bị rò rỉ.

Lưu ý rằng nếu bạn đã vượt qua số Owner trong hàm dựng thì khi đó chủ sở hữu sẽ được quản lý bởi chủ sở hữu đó.

Mã của bạn vẫn có khả năng bị rò rỉ nếu cài đặt URL tăng. Tôi sẽ viết nó như thế này:

function GetService(const Addr: string): IInvokable; 
begin 
    Result := THTTPRIO.Create(nil); 
    (Result as IRIOAccess).RIO.URL := Addr; 
end; 

Có nói tất cả điều đó, lớp THTTPRIO không hỗ trợ IInvokable vì vậy có lẽ mã thực tế của bạn trông hơi khác nhau.

+0

+1 Tôi thường cẩn thận tách riêng việc sử dụng giao diện với việc sử dụng đối tượng. Cảm ơn bạn về thông tin. Vì vậy, nếu chúng ta thêm sau khi kết quả: = (RIO như IInvokable); hai dòng mới Kết quả: = nil; Showmessage (Rio.URL) nó sẽ gây ra một AV, phải không? – Justmade

+0

@Justmade Yes Tôi nghĩ rằng AV –

+0

Không, không nhất thiết. Có thể, rằng đối tượng vẫn có thể hoạt động nhiều hơn hoặc ít hơn. Bạn chỉ nhận được AV nếu lệnh gọi URL tham chiếu đến con trỏ NIL (hoặc giá trị con trỏ khác cũng gây ra AV) – dummzeuch

Các vấn đề liên quan