Jump to content

Libere objetos automaticamente da memória com interfaces no Delphi!


Postagens Recomendadas

O que são interfaces?

Uma interface Delphi define um conjunto de métodos e propriedades que um objeto pode implementar, permitindo que outros objetos se comuniquem com ele de forma independente da classe ou hierarquia de herança. Isso oferece maior flexibilidade e escalabilidade ao projeto de software, pois permite que os objetos sejam facilmente substituídos por outros objetos que implementam a mesma interface.

Além disso, as interfaces também ajudam a reduzir a dependência de tipos e aumentar a coesão do código. Em Delphi, as interfaces são definidas usando a palavra-chave "interface" e podem ser implementadas por qualquer classe que queira oferecer funcionalidade para outras classes ou componentes. As interfaces também podem ser herdadas de outras interfaces, permitindo a criação de hierarquias de interfaces para modelar relacionamentos entre objetos e componentes.

Aqui está um exemplo simples de como declarar uma interface no Delphi:

type
  IExemplo = interface
    procedure Foo;
  end;

 

Chega de teoria e bora para o exemplo!

No Delphi vamos criar uma nova aplicação VCL

image.png

Em seguida crie uma nova Unit

image.png

Nessa Unit vamos colar o código abaixo:

unit Unit1;

interface

type
  iExemplo = interface
  ['{04AD028A-AFA9-45DD-B257-1EFB80378B8C}'] // CTRL + SHIFT + G para gerar a chave da interface
    procedure Foo;
end;

  TExemplo = class
  public
    procedure Foo;
  end;

implementation

{ TExemplo }

procedure TExemplo.Foo;
begin
  // código para implementar o método "Foo"
end;

end.

No Form principal adicione um botão e duplo click nele!

image.png

Adicione o código abaixo no evento click do botão e de uses na Unit1

procedure TForm4.btn1Click(Sender: TObject);
var
  exemplo : TExemplo;
begin
  exemplo := TExemplo.Create;
  ShowMessage('objeto exemplo criado!');
end;

Botão direito do mouse e selecione View Source

image.png

Adicione a linha abaixo para habilitar a exibição dos, vazamento de memória:

ReportMemoryLeaksOnShutdown := True;

image.png

Agora execute a aplicação, click no botão e finalize a mesma

E temos a mensagem abaixo, indicando que TExemplo foi criado, porém, não foi liberado da memória

image.png

 

E como resolver isso?

Vamos utilizar interfaces!

Refatorando a classe Exemplo:

unit Unit1;

interface

type
  iExemplo = interface
  ['{04AD028A-AFA9-45DD-B257-1EFB80378B8C}']
    procedure Foo;
end;

  TExemplo = class(TInterfacedObject, iExemplo)
  public
    procedure Foo;
  end;

implementation

{ TExemplo }

procedure TExemplo.Foo;
begin
  // código para implementar o método "Foo"
end;

end.

Note que agora TExemplo herda de TInterfacedObject e implementa iExemplo

Na Unit pricipal vamos mudar o tipo da variável exemplo para iExemplo:

procedure TForm4.btn1Click(Sender: TObject);
var
  exemplo : iExemplo; // alterado para iExemplo
begin
  exemplo := TExemplo.Create;
  ShowMessage('objeto exemplo criado!');
end;

Agora execute a aplicação novamente e a nossa mensagem de vazamento de memória não será exibida!

 

Oloco meu! Como o Delphi fez isso?

Ao herdar de TInterfacedObject, a classe TExemplo já tem a implementação padrão dos métodos "AddRef", "Release" e "QueryInterface", que são necessários para que a interface funcione corretamente.

É importante lembrar que, ao usar TInterfacedObject, seu objeto será gerenciado automaticamente pelo mecanismo de referência contada do Delphi. Isso significa que o objeto será automaticamente liberado da memória quando não houver mais referências a ele, o que pode simplificar o gerenciamento de memória em seus projetos.

 

 

 

  • Curtir 3
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...