Я знаю, что я опоздал на это обсуждение на 2 года, но недавно я столкнулся с этой утечкой памяти в нашем коде, и я не мог заставить предложенный ответ Кена работать.Поэтому с помощью моего коллеги мы нашли другой ответ, чтобы продолжать использовать вложенные анонимные методы, но при этом избежать утечек памяти.
Ниже приведен пример решения, которое мы нашли:
procedure TForm1.Button1Click(Sender: TObject);
var P, B: TProc;
begin
B := procedure
begin
end;
P := procedure
begin
B;
end;
B := nil;
end;
Я считаю, что из-за того, как локальные переменные связаны с целью продления их жизни для того, чтобы анонимный метод мог использовать его вне области, в которой он был создан, он делает копию основногоинтерфейсный объект для перемещения переменной из стека в кучу, и при этом он вызывает AddRef, который увеличивает счетчик ссылок.Установка переменной равной nil после того, как она была использована, вызывает Release, который, в свою очередь, уменьшает счетчик ссылок до 0, что позволяет освободить интерфейсный объект.
После этого мы не увидели утечек памяти, которыепроисходили раньше.
Является ли это ошибкой или нет, я не могу ответить на этот вопрос, но мне интересно услышать мнения других.Мы рассматриваем это как способ позволить нам продолжать использовать анонимные методы во вложенной форме, подобной этой.