Delphi TThread pod ARC (iOS) nie zostało zwolnione

Jaki jest właściwy sposób zakończenia wątku za pomocą Delphi dla systemu iOS pod zarządzaniem ARC?

Weź ten prosty przykład:

  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  public
    destructor Destroy; override;
  end;

  TForm2 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    FThread: TMyThread;
  public
  end;

{ TMyThread }
destructor TMyThread.Destroy;
begin

  ShowMessage('Destroy');

  inherited Destroy;

end;

procedure TMyThread.Execute;
begin

  Sleep(5000);

end;

{ TForm2 }
procedure TForm2.Button1Click(Sender: TObject);
begin
  FThread := TMyThread.Create(TRUE);
  FThread.FreeOnTerminate := TRUE;
  FThread.Start;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
  ShowMessage(FThread.RefCount.ToString);
end;

procedure TForm2.Button3Click(Sender: TObject);
begin
  FThread := nil;
end;

Ok, naciśnięcie przycisku 1 spowoduje pojawienie się wątku. Po uruchomieniu wątku kliknięcie przycisku Button2 spowoduje wyświetlenie wartości RefCount 3 !! Cóż, 1 to odwołanie do mojej zmiennej FThread, i istnieją 2 dodatkowe odnośniki, które TThread tworzy wewnętrznie ... Zagłębiłem się w kod źródłowy i odkryłem, że RefCount jest tutaj zwiększony:

constructor TThread.Create(CreateSuspended: Boolean);

  ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID);
  if ErrCode <> 0 then
    raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]);
  {$ENDIF POSIX}

I tu:

function ThreadProc(Thread: TThread): Integer;
var
  FreeThread: Boolean;
begin
  TThread.FCurrentThread := Thread;

Cóż ... Po zakończeniu wątku (w moim przypadku po 5 sekundach) RefCount zmniejszy się do 2 (ponieważ ustawiłem FreeOnTerminate na TRUE, ale jeśli nie ustawię FreeOnTerminate na TRUE, RefCount będzie nadal wynosić 3 ).

Widzisz problem? Wątek nigdy nie jest ukończony, a destruktor nigdy nie jest wywoływany, jeśli zadzwonięFThread := nilzatem RefCount powinno się zmniejszyć z 2 do 1 (lub z 3 do 2 w przypadkuFreeOnTerminate = FALSE), a wątek nigdy nie jest wypuszczany pod ARC ...

Może czegoś mi brakuje, ponieważ jestem przyzwyczajony do pracy z wątkami bez ARC ... Więc czego tu brakuje? Czy istnieje błąd w implementacji TThread w ARC?

Może ta definicja TThread

private class threadvar
  FCurrentThread: TThread;

powinno być coś takiego

private class threadvar
  [Weak] FCurrentThread: TThread;

questionAnswers(1)

yourAnswerToTheQuestion